hippomarkio 0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0daf3f8662d3d1f055b778cbe64e49a38e8277ab3767bb71a1d8c090c9e47768
4
+ data.tar.gz: b0d688e480e62bfc11750149167cfeaeb3f546efd1e80fdbb6d7d5686882f0e3
5
+ SHA512:
6
+ metadata.gz: e230792318e9f9ab30e529ef40650401de65930b16a3ba1ea22afea7d08e7aad79dbb486a53eeac9a352a641bc89586ed9d479fcae9413a1d63db4b25c8bdef8
7
+ data.tar.gz: 0da33b00401b0a0c44d8162d1da7f06bf34323da84c9174eae3d3cb51d05833382c868f1ebd3a593cf2cb507930720fdc6b22d2819c85158144a9f68c60c087f
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - jruby-19mode
6
+ - rbx-19mode
7
+ script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in markio.gemspec
4
+ gemspec
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2020 HippoHack
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,67 @@
1
+ # Markio
2
+
3
+ A Ruby Gem for parsing [Netscape Bookmark File Format](http://msdn.microsoft.com/en-us/library/aa753582\(v=vs.85\).aspx)
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/markio.png)](http://badge.fury.io/rb/markio)
6
+ [![Build Status](https://travis-ci.org/spajus/markio.png)](https://travis-ci.org/spajus/markio)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'markio'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ ```bash
19
+ $ bundle
20
+ ```
21
+
22
+ Or install it yourself as:
23
+
24
+ ```bash
25
+ $ gem install markio
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ### Parsing bookmarks file
31
+
32
+ ```ruby
33
+ bookmarks = Markio::parse(File.open('/path/to/bookmarks.html'))
34
+ bookmarks.each do |b|
35
+ b.title # String
36
+ b.href # String with bookmark URL
37
+ b.folders # Array of strings - folders (tags)
38
+ b.add_date # DateTime
39
+ b.last_visit # DateTime
40
+ b.last_modified # DateTime
41
+ end
42
+ ```
43
+
44
+ ### Building bookmarks file
45
+
46
+ ```ruby
47
+ builder = Markio::Builder.new
48
+ builder.bookmarks << Markio::Bookmark.create({
49
+ :title => "Google",
50
+ :href => "http://google.com"
51
+ })
52
+ file_contents = builder.build_string
53
+ File.open('/path/to/bookmarks.html', 'w') { |f| f.write file_contents }
54
+ ```
55
+
56
+ ## TODO
57
+
58
+ - Builder output to file
59
+ - Builder should not ignore bookmark folders
60
+
61
+ ## Contributing
62
+
63
+ 1. Fork it
64
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
65
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
66
+ 4. Push to the branch (`git push origin my-new-feature`)
67
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ task default: :spec
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'markio/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "hippomarkio"
8
+ gem.version = Markio::VERSION
9
+ gem.authors = ["hippohack"]
10
+ gem.email = ["benzoh.g@gmail.com"]
11
+ gem.description = %q{Import/export utility for Netscape Bookmark Format}
12
+ gem.summary = %q{Handles parsing and building Netscabe Bookmark Format in Ruby way.}
13
+ gem.homepage = "https://github.com/hippohack/hippomarkio"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'nokogiri'
21
+ gem.add_development_dependency 'rspec', '~> 2.11'
22
+ gem.add_development_dependency 'pry-nav'
23
+ gem.add_development_dependency 'guard-rspec'
24
+
25
+ end
@@ -0,0 +1,9 @@
1
+ require "markio/version"
2
+ require "markio/bookmark"
3
+ require "markio/parser"
4
+ require "markio/builder"
5
+ module Markio
6
+ def self.parse(data)
7
+ Parser.new(data).parse
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ require 'date'
2
+ class Markio::Bookmark
3
+
4
+ attr_accessor :title, :href, :add_date, :last_visit, :last_modified, :folders
5
+
6
+ def self.create data
7
+ bookmark = new
8
+ bookmark.title = data[:title]
9
+ bookmark.href = data[:href]
10
+ bookmark.add_date = data[:add_date] || DateTime.now
11
+ bookmark.last_visit = data[:add_date]
12
+ bookmark.last_modified = data[:last_modified]
13
+ bookmark.folders = data[:folders] || []
14
+ bookmark
15
+ end
16
+
17
+ def == other
18
+ unless other.nil? or other.class != self.class
19
+ other.href == href and other.title == title
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,80 @@
1
+ require 'nokogiri'
2
+
3
+ class Markio::Builder
4
+
5
+ attr_accessor :bookmarks
6
+
7
+ def initialize(options = {})
8
+ @title = options[:title] || 'Bookmarks'
9
+ @bookmarks = []
10
+ end
11
+
12
+ def build_string
13
+ build
14
+ end
15
+
16
+ def build_file(file)
17
+ File.new(file, 'w') do |f|
18
+ f.write build
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def build
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
+
39
+ docparts = Nokogiri::HTML::DocumentFragment.parse ''
40
+ Nokogiri::HTML::Builder.with(docparts) do |html|
41
+ html.comment <<END
42
+ This is an automatically generated file.
43
+ It will be read and overwritten.
44
+ DO NOT EDIT!
45
+ END
46
+ html.meta('HTTP-EQUIV' => 'Content-Type', 'CONTENT' => 'text/html; charset=UTF-8')
47
+ html.title @title
48
+ html.dl {
49
+ html.p
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
62
+ end
63
+ }
64
+ end
65
+
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
+ }
79
+ end
80
+ end
@@ -0,0 +1,76 @@
1
+ require 'nokogiri'
2
+ require 'date'
3
+ module Markio
4
+ class Parser
5
+
6
+ def initialize data
7
+ @document = Nokogiri::HTML data
8
+ end
9
+
10
+ def parse
11
+ bookmarks = []
12
+ traverse(@document, []) do |bookmark|
13
+ bookmarks << bookmark
14
+ end
15
+ consolidate bookmarks
16
+ end
17
+
18
+ private
19
+
20
+ def traverse node, folders, &block
21
+ node.xpath("./*").each do |child|
22
+ case child.name.downcase
23
+ when 'dl'
24
+ traverse child, folders, &block
25
+ folders.pop
26
+ when 'a'
27
+ yield parse_bookmark(child, folders)
28
+ when 'h3'
29
+ folders << child.text
30
+ else
31
+ if child.children.any?
32
+ traverse child, folders, &block
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ def parse_bookmark(node, folders)
40
+ data = {}
41
+ node.attributes.each do |k, a|
42
+ data[k.downcase] = a.value
43
+ end
44
+ bookmark = Bookmark.new
45
+ bookmark.href = data['href']
46
+ bookmark.title = node.text
47
+ bookmark.folders = (Array.new(folders) + parse_tags(data['tags'])).uniq
48
+ bookmark.add_date = parse_timestamp data['add_date']
49
+ bookmark.last_visit = parse_timestamp data['last_visit']
50
+ bookmark.last_modified = parse_timestamp data['last_modified']
51
+ bookmark
52
+ end
53
+
54
+ def parse_timestamp(timestamp)
55
+ Time.at(timestamp.to_i).to_datetime if timestamp
56
+ end
57
+
58
+ def parse_tags(tags)
59
+ tags ? tags.split(/,/x) : []
60
+ end
61
+
62
+ def consolidate(bookmarks)
63
+ consolidated = []
64
+ bookmarks.each do |b|
65
+ index = consolidated.index b
66
+ unless index.nil?
67
+ consolidated[index].folders += b.folders
68
+ else
69
+ consolidated << b
70
+ end
71
+ end
72
+ consolidated
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,3 @@
1
+ module Markio
2
+ VERSION = "0.1"
3
+ end
@@ -0,0 +1,11 @@
1
+ This archive contains a snapshot release of MacVim 7.3. It requires
2
+ Mac OS X 10.8 (Mountain Lion) or later. It will NOT run on earlier versions of
3
+ Mac OS X!
4
+
5
+ To install, drag the MacVim icon into the Applications folder.
6
+
7
+ For usage instructions, please start MacVim and type ":h macvim" (without the
8
+ quotes).
9
+
10
+ This archive also contains the script "mvim" which can be used to start MacVim
11
+ from Terminal. Type ":h mvim" in MacVim for help on how to install it.
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
3
+ <!-- This is an automatically generated file.
4
+ It will be read and overwritten.
5
+ Do Not Edit! -->
6
+ <TITLE>Bookmarks</TITLE>
7
+ <H1>Bookmarks</H1>
8
+ <DL><p>
9
+ <DT><A HREF="http://www.gojee.com/" ADD_DATE="1321971101" PRIVATE="0" TAGS="food,drinks,ingredients,visual,recipes">Gojee</A>
10
+ <DD>Choose what you crave, what you have and what you dislike to get the perfect dish suited to your needs!
11
+ <DT><A HREF="http://banksimple.com/blog/BankSimple/a-first-look-at-BankSimple/" ADD_DATE="1316646441" PRIVATE="0" TAGS="banking,Test!">A First Look at BankSimple | BankSimple Blog</A>
12
+ <DT><A HREF="http://djangostyle.com/" ADD_DATE="1315576821" PRIVATE="0" TAGS="django,heroku,publishing,Test!">DjangoStyle</A>
13
+ <DT><A HREF="http://fornoobs.info/2009/10/php5-not-enabled-by-default-in-snow-leopard-osx-10-6-1/" ADD_DATE="1310999555" PRIVATE="0" TAGS="mac,osx,snowleopard,php,php5,Test!">PHP5 not enabled by default in Snow Leopard (OSX 10.6.1) — fornOObs.info</A>
14
+ <DT><A HREF="http://www.domalomenos.com/1601297/" ADD_DATE="1310722961" PRIVATE="1" TAGS="architecture,design,coimbra">001. João Mendes Ribeiro - Casa da Escrita - do mal o menos</A>
15
+ </DL><p>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
+ <!-- This is an automatically generated file.
3
+ It will be read and overwritten.
4
+ DO NOT EDIT! -->
5
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
6
+ <TITLE>Bookmarks</TITLE>
7
+ <H1>Bookmarks</H1>
8
+ <DL><p>
9
+ <DT><H3 ADD_DATE="1350296505" LAST_MODIFIED="1350743233" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Bar</H3>
10
+ <DL><p>
11
+ <DT><A HREF="javascript:var%20d%3Ddocument,w%3Dwindow,e%3Dw.getSelection,k%3Dd.getSelection,x%3Dd.selection,s%3D(e%3Fe():(k)%3Fk():(x%3Fx.createRange().text:0)),f%3D%27http://www.tumblr.com/share%27,l%3Dd.location,e%3DencodeURIComponent,p%3D%27%3Fv%3D3%26u%3D%27%2Be(l.href)%20%2B%27%26t%3D%27%2Be(d.title)%20%2B%27%26s%3D%27%2Be(s),u%3Df%2Bp%3Btry%7Bif(!/%5E(.*%5C.)%3Ftumblr%5B%5E.%5D*%24/.test(l.host))throw(0)%3Btstbklt()%3B%7Dcatch(z)%7Ba%20%3Dfunction()%7Bif(!w.open(u,%27t%27,%27toolbar%3D0,resizable%3D0,status%3D1,width%3D450,height%3D430%27))l.href%3Du%3B%7D%3Bif(/Firefox/.test(navigator.userAgent))setTimeout(a,0)%3Belse%20a()%3B%7Dvoid(0)" ADD_DATE="1350296576" TAGS="Bookmarks Bar">Share on Tumblr</A>
12
+ <DT><A HREF="http://192.168.0.111/webman/index.cgi" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHUlEQVQ4jWM8f/+9w5rTL+qvPfniwEAC0JLhORBiKtHIsvLE0/qrjz+TpJmBgYHh0oMPDn///mVg9Gw7/J9UzciA5e+fP5ToZ2D5Q6EBDHbV2/8jA7vq7f/tqrf/P3zpGYoYjI9M21Vv/88Ec4F1xRYG64otDAdbPBj+/PnDYKMrCRdD5iPTf/78YYAb8OfPHwZk9pHLzxmOdvgwdEYbo4ij0/BARA7Mv3/+MBTMPcrAwMDAcGZCCAO6GmQaHohnJoQwMDAwMBjkrGBgYGBguDAlgoGBgYHhyOXnKDbC5GF8Ru30xZSlA0qjkeXP3wFOSEwmKuIH/v75w0AONlERP8A8a3LHw4cvPik8evVB4d+/fwzEYjN1qQNFocaNAHb5GMnZ0/wiAAAAAElFTkSuQmCC">Synology DiskStation - DiskStation</A>
13
+ <DT><A HREF="http://www.ruby-doc.org/core-1.9.3/" ADD_DATE="1350572675" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAGXIcUm9AAAAWNJREFUOBFsj8tKAlEYx49d3IUIgV1HnRkv44yXoJ2P4Cv0Cr1CCO2CWrjpGRJaRENlkWREELQp6GZJSRCWYOaoM9rUv3OmTLssPr5z+/3+3yEAyJ8iZJCdaSFhFtMKai5HFcspGHeFhPU2ne7vMP/BA+yyHhJnEAugHg3qtYlh6PNzOs5O0VxdiVtwMtnH+k8BIZa5ofAJBmuyoGuxIF7GnGilltA+PjKwn0UroypfE9i6AkIsY00W4layLOp0jeaUhHuXA5XFBSB/CSOz0UYuC31nnetOQIiNbTRJUBClY8uiweCGIqIUDeJ8yA5NXQPKT3g9yKG1s2VidxtQVef3BBWZ5xDxQ1PEdgd+lHhc+d0oBjw45Mex6R6x6sLHmaWgF0WO+xRUw5zzLeyjsGAyuE6TyyEeeQoXKNxb1/TsWebN94gPjCOQiZ2msmRYf6b9QfJizzOKE3ESt1Rw0yP6LfgAAAD//2YravMAAAC6SURBVKWROwvCQBCEr7K3VYx5Bz3jr7ay8Ef4QO1EOQOaYCuI+IpddNyVBBQDGiyWgePmu9k5ASlKl5aNs7RwJd02DPSNCiZmFUPSuV3DxtMRunVEpGvSgzSTe9vB0dfKggGZedc0MUjNYwLwMGSRQiKvng+I6eU9mflyZnxVPleO9kyyykvwDZAlCQgSuvrnCr8AGDKiJEuCnKT13gGXWGys5OanJapZt6CZfozMsa0hmHYglOrhn3kAF/hUdfHDKLMAAAAASUVORK5CYII=">Index of Classes &amp; Methods in Ruby 1.9.3 (Ruby 1.9.3)</A>
14
+ <DT><A HREF="http://guides.rubyonrails.org/" ADD_DATE="1350296576">Ruby on Rails Guides</A>
15
+ <DT><A HREF="http://lvh.me:3000/" ADD_DATE="1350296576" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACyklEQVQ4jXWSXWxUVRSFv3vOvXc6w51pO1MoSVtwqs1ghYgOf33QIBISjY0RMglNADUaEx9IlMTEmJiY+KZvAkr4DQQEBKTA9KGJRJ4wUh8I1hZTIBOorUpT4rSdzs+9Z/tQmUwK7mQle5+TtdbeZx+oicPdbNj7Kitrzz7rIn62x90mIhb/FxnQv79PVj5Fyp9Q+OoVOgG+WM/iPz/khnzZJtld6czjuBpgx0baup9it2WhtIXT4rH6+WbGty7nXFMslCLWQqvnv9zxZOexCwO56VoBBfDxD9ztvcm7QUAZA60ea7YtJ9sYIokTg8DgWmZB2Ew3PbYDgO+GuZ6M8fPKZrZXby0FkSZQmr6R0ptb9v12eb6Aqi3qFB4GqrDcOQ/fZ6FjngW4+dET50+/0/Fi1eNhcvI13sgs45S2cKuKoShEEnO5CKNT8lNrTHVNlczYwSGzYteZ0UkNcK6bt7Z0cFxbOAhUYYdBOWAMiBBzpA1jCCmJuhLU7x+Y7rMzoFct4j0FGjNnFghlbeFiAN9/ZHUVQ3HoL+sQgB4CaShzekmcdY0hkggcGOSFgXG+6VwY2uwqK4Ix1KL/dmVn5sz9i9UtXLlPOV7hlONSdy/P1c19HOnLMf5ScoG0e8GmWvJU0R9fcfCfnkcecX799XrWbl0WOtEYcdrnj3Dtb7Nn7fHCzocEC1DpdFq5rmvPzMyoVH0hcvKZW6Patl20PTd3YGYHH6je55royZcYq99XbAGw0+m0bdt22PO8cBAE4Wg0WvfAGCf7x9iJ11uLbyMBAEdGIh98b607+3nlx+JInux/f8joVCrlKqViQIPrugkRaRaR9l+CpbMT+aLdFcsn+8fqvj1QWnMUMJdnl17qvSPDk5OTBhCdSCQsz/MolUqilKporYsikgcmbsmi4V8n/GtZ/+mjvqh8oVAoViqVUjwe93O5nAH4F06pHMB3vhJeAAAAAElFTkSuQmCC">lvh.me:3000</A>
16
+ <DT><A HREF="javascript:function%20bm_add_newphsvuf2h()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27https://saveit.in/%27)%3B%7Ds.setAttribute(%27src%27,%27https://saveit.in/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27https://saveit.in/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_newphsvuf2h()%3B" ADD_DATE="1350296576">Save It</A>
17
+ <DT><A HREF="javascript:function%20bm_add_new3nrzr6u4()%7Bvar%20d%20%3D%20document%3Bvar%20el%20%3D%20d.getElementById(%27bm-notification-id%27)%3Bif%20(el%20%3D%3D%20null)%7Bel%20%3D%20d.createElement(%27div%27)%3Bel.setAttribute(%27id%27,%27bm-notification-id%27)%3Bd.body.appendChild(el)%3B%7Del.innerHTML%20%3D%20%27%3Cstyle%20id%3D%22saveitin-div-style%22%3E%20%20%20%20%23saveitin-top-div%7Bpadding:%2010px%3B-moz-box-shadow:%200%3Bposition:%20fixed%3Btop:%200%3Bz-index:%2099999%3Bmin-height:%2034px%3Bbackground:%20white%3Bwidth:%20100%25%3B-moz-box-shadow:%200%200%2025px%20%23666%3B-webkit-box-shadow:%200%200%2025px%20%23666%3Bbox-shadow:%200%200%2025px%20%23666%3Bfont-family:%20Arial,sans-serif%3Bfont-size:%2012px%3Bcolor:%23333%3Bline-height:18px%3B/*text-align:center%3B*/%20%20%20%20%20%20%20%20vertical-align:middle%3B%7D%23saveitin-inner-div%7Bmargin-left:%20auto%3Bmargin-right:%20auto%3Bwidth:%2050em%3B%7D/*%23saveitin-top-div%20h4%7B*/%20%20%20%20%20%20%20%20/*text-align:%20center%3B*/%20%20%20%20/*%7D*/%20%20%20%20%23saveitin-top-div%20input%5Btype%3Dsubmit%5D,%23saveitin-top-div%20input%5Btype%3Dbutton%5D%7Bbackground-color:%20%2314B1E5%3B-webkit-border-image:%20none%3Bbackground-image:%20-moz-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-ms-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-o-linear-gradient(%231BB8EC,%230AA7DB)%3Bbackground-image:%20-webkit-linear-gradient(top,%231BB8EC,%230AA7DB)%3Bbackground-repeat:%20repeat-x%3Bborder:%201px%20solid%20%230AA7DB%3Bborder-radius:%204px%3B-moz-border-radius:%204px%3B-o-border-radius:%204px%3B-webkit-border-radius:%204px%3Bcolor:%20white%3Bfont-family:%20HelveticaNeue-Light,%22Helvetica%20Neue%20Light%22,%22Helvetica%20Neue%22,Arial,Helvetica,sans-serif%3Bfont-weight:%20bold%3Bfont-height:%2013px%3Bpadding:%204px%2010px%3Btext-align:%20center%3Btext-decoration:%20none%3Btext-shadow:%20rgba(0,0,0,0.246094)%200px%20-1px%200px%3Bvertical-align:%20middle%3B%7D%23saveitin-form%7Bdisplay:%20none%3B%7D%23saveitin-form%20label%7Btext-align:%20right%3Bdisplay:%20inline-block%3Bwidth:%208em%3B%7D%23saveitin-form%20input%7Bborder:%201px%20solid%20%23ccc%3Bbackground-color:%20%23fff%3Btext-align:%20left%3Bdisplay:%20inline-block%3B%7D%3C/style%3E%3Cdiv%20id%3D%22saveitin-top-div%22%3E%20%20%3Cdiv%20id%3D%22saveitin-inner-div%22%3E%20%20%20%20%20%20%20%20%3Ch4%3ELoading...%3C/h4%3E%20%20%20%20%3C/div%3E%3C/div%3E%27%3Btry%7Bs%3Dd.createElement(%27sc%27%20%2B%20%27ript%27),l%3Dd.location,t%3Dd.getElementsByTagName(%27title%27)%5B0%5D%3Bvar%20m%3D%20d.getElementsByTagName(%27meta%27)%3Bvar%20desc%20%3D%20%27%27%3Bfor%20(var%20i%20%3D%200%3Bi%20%3C%20m.length%3Bi%2B%2B)%7Bvar%20n%20%3D%20m%5Bi%5D%5B%27name%27%5D%20%7C%7C%20m%5Bi%5D.getAttribute(%27property%27)%3Bif%20(n%20%26%26%20(n.toLowerCase().indexOf(%27description%27)%20!%3D%20-1))%7Bvar%20cnt%20%3D%20m%5Bi%5D%5B%27content%27%5D%3Bif%20(cnt%20%26%26%20(cnt.length%20%3E%20desc.length))%7Bdesc%20%3D%20cnt%3B%7D%7D%7Dif%20(!l%20%7C%7C%20l%20%3D%3D%20%22about:blank%22)%7Bwindow.location.assign(%27http://dev.saveit.in:3000/%27)%3B%7Ds.setAttribute(%27src%27,%27http://dev.saveit.in:3000/bookmarklet%3Fb%3D%27%2B%20encodeURIComponent(l.href)%2B%20%27%26t%3D%27%20%2B%20encodeURIComponent(t%20%3F%20t.innerHTML%20:%20l.href)%2B%20%27%26d%3D%27%20%2B%20encodeURIComponent(desc)%2B%20%27%26s%3D%27%2B(new%20Date().getTime()))%3Bif%20(d.body)%7Bd.body.appendChild(s)%3B%7Delse%7Bwindow.onload%20%3D%20function()%7Bd.body.appendChild(s)%3B%7D%3B%7D%7Dcatch(e)%7Balert(%27error:%20%27%20%2B%20e)%3Bwindow.location.assign(%27http://dev.saveit.in:3000/bookmarklet/failover%3Fb%3D%27%2B%20encodeURIComponent(l.href))%3B%7D%7D%3Bbm_add_new3nrzr6u4()%3B" ADD_DATE="1350296576">Save It Dev</A>
18
+ <DT><A HREF="http://localhost:3000" ADD_DATE="1350487106" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAI+peJuewAAAgpJREFUOBE8T89P0nEY/nqq/8Brrrp76NKhrWamM8fqq5UidbBNEjHRaIiooWAxhCQCayPHb2JqwFdTFFs2I2urnPMgm2aSIEKJOIoYPz7vG3Lo2Z4fh+d9t4dCRAopqqTohVw29Kn0nGW5qo8nFm7X1jPxa5zPscvsUErcmnjnF/8ov0/7TvGrWUf9Akr+H0fc3ZeiUa1jJaBf+7hhjGuN/ZnBZgFo2iSgbhGBStALNuso8b4YyS+Zn+2HnHZ+8cmRBFnspkN+K2ZDTxBzetwNKpBWcLCyR4gNopECVXhdY8F25zz+dDF5nPNi8qUjG+JyT1PbJ84fD11tXI7XNGFY3JKJ7w2True34cxdGnTMGNbyu0Bn9oDy/Regx33wyOODhJvJpe5JMXiBZlNRYW9ZTCLdSPTLICl5QBbscnJR1Qd1aimsh7/D9IdF2InE0OR0oUAsg84BNfj1Qzkib4aQiNNBHbrdJ/9OuTcz3nlMMSYSdvGIeOIVueV8g1sHSVKYWMQElweK8rNoarwCkfXBLHxtw9+eGxKKZWBKVyfdazjL4J/pjjzM0rDyuhvYjhkcnpyCxYU5sNosIKmqIbqKagi87YF0WpfDsBzTTIOUorTtxzrNM/5vTiXu2+tzu/abGDXSaLQ+Rr19HJ+qlMQwZsC6ikpik90hO3ujuLmlyf06MGBg9eHAPwAAAP//y9NkNgAAAcNJREFUY/j//z9DY3fTlkPtcf+nuHv9meji8m9+dNS/D/du/n/z5s2/27du/vv39++/ZWuW/vNozPmXv2Hnv5zVm3+Xbt//f9KGeY0MIANer4nr/r8/6f+KWO/ffS7+/x9duvLvH1Di18+fQPL//39A3ref3//H9BT+95vQ+y9m9ZHfM7Ys/v9xXSTEgI+bYiL/HUj+/3xRxK+HF07/BetCIv6Cjfv/f+uJ3f/MSyP/Zy1b8uv9vqK/vzcE14FdMHNZg0jn6rn3Jm1b8//IgkV/1mw7+Hvhht2/r99+8OfX799/vn3+/Pffnz///vz/+789JenvjpK4H//f9f5/dbshiYGB4T8j0DIGna03TDp65x997Bv+d2JK6f+goo7/qbUT/9dvP/q/fvmm/6tKK/+cXLX63/Gc4v9fg+L+v15Z8+zi/25FsAtABoAxAwPnt8BQy3Px2XnJJW3dMR0zFsYt2XQwds2uB8XVbf9nmNv+veEb9up1ZOKM2xZBRiA9cAOADLBL4IbBDAXSuedui6Z3Tp5zobzm/5fWjj3IauAGwAUZGJj+NzQwNQAxAxDDxYEG7Sgqyn65avlSoDxLA0gdUAwAHdC5thMbc+wAAAAASUVORK5CYII=">http://localhost:3000/member/general/register_step2?confirmation=k13bpG6Q6Tj0b4oV2wMY&amp;external_login_type=2&amp;utm_campaign=login&amp;utm_medium=login&amp;utm_source=mojeid</A>
19
+ <DT><A HREF="javascript:(function()%7Bf%3D%27http://www.delicious.com/save%3Furl%3D%27%2BencodeURIComponent(window.location.href)%2B%27%26title%3D%27%2BencodeURIComponent(document.title)%2B%27%26notes%3D%27%2BencodeURIComponent(%27%27%2B(window.getSelection%3Fwindow.getSelection():document.getSelection%3Fdocument.getSelection():document.selection.createRange().text))%2B%27%26v%3D6%26%27%3Ba%3Dfunction()%7Bif(!window.open(f%2B%27noui%3D1%26jump%3Ddoclose%27,%27deliciousuiv6%27,%27location%3D1,links%3D0,scrollbars%3D0,toolbar%3D0,width%3D710,height%3D660%27))location.href%3Df%2B%27jump%3Dyes%27%7D%3Bif(/Firefox/.test(navigator.userAgent))%7BsetTimeout(a,0)%7Delse%7Ba()%7D%7D)()" ADD_DATE="1350743232">Add to Delicious</A>
20
+ <DT><H3 ADD_DATE="1350544318" LAST_MODIFIED="1350619431">MD</H3>
21
+ <DL><p>
22
+ <DT><A HREF="http://rubymine.org" ADD_DATE="1350393018" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAEtCnF8ZgAAAPlJREFUOBGkkTFKA0EYhT8Tl7A7mxOkyw2CKAFPEETwCGktAlrYWQhWFh7E0k5sLcREKwkYsxuy2UUQC8EubDG+iawkEdOkeAwz771v5mew1rKOVpehhLTqgj8AFTYsbKaYmwlhf4J5zjBXDnKm82XYAmBQoRUZPgYB22PM5Q8g7KeEnbjCXhTwNvZozEN+ATK3hgF5HGIFeR/h7ST4Rxn+8YvPrvyp82LDZwq1AjIDPIKnZ5dHAecK2FdDuwjMVo0V+VwIkjtvfhSuofoAJ13IBDpMoL5QLn5JkCE0lDuVvpQ9cDmeoKlNIlmnu/8ACt/DfpHrwa0DfAMAAP//dMaXywAAAJ1JREFUxZCrCgJhEIW/5BNs9hVsvofPoUkwLtgsNkEQ1tsGg9isJsOClyYYfQSjRXA8fxgQYfKGw8wcvjkDwx6yK+QXeKrezYxIW2ic4S09xPcSxwp2Cw0bBZ2gFS27f4T2DJpLGBTqWcOrBEuSOXQwqjo4dV79BA2fH6MbLbqvpbHzOl6hqyMZt6Q5dByMqvi+8wo7hA+LAv79+gO+DKpWTzgNlsEAAAAASUVORK5CYII=">MD platform - Feature #3067: MojeID implementation - Redmine</A>
23
+ <DT><A HREF="http://1.2.3.4:8080/" ADD_DATE="1350544337" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHGlET1QAAAACAAAAAAAAAAgAAAAoAAAACAAAAAgAAAGgmXiD+wAAAWxJREFUOBFi+P//PwM6lpKSEjE3Mp5gaWy0Izsp8nVuSsznvJSYx2EBnmUyMjKcyOoxNEdHRC1NT07+UlWc8+X5lX3/Pt899P/znQP/P97a93/PyinvXeys9jEwMLDCDEExIDUheVVjTe2/poq8Z1/uHf7/8foOMP5wbft/GD6zfeEfVzvrdRgG2Nra2rs4OP5OTUr+e273si8fru/8P6ev4f/WRf1wzSBDNi3o+e/rZv9OWlpaGGQI3AWerq6X21va/ifGJ/4/tnnuj1eXtv4/v3MBWPP7q9tQDHlyev3/gqTIAhQDIkLDHuVm5/6Pj4n/9OzseriGz7cP/D+/axGYf2br3P8fgN7atXzy/7yksOkoBng42z/rqCn8Fhkc+ObK3kXfYX4+smH6/5bSdLAB2xf3/t+2sPv/xnkd/0vSYxbCDQCGKmN/c9mXzqqs/zM7K989PLH6D8wAdLqnNu//naMr/5dmxPaADAAAAAD//8RlfGoAAAGrSURBVGP4//8/AwgXpsbcfn1py/8P17ZjxXePrv5/csus/xMaCv9f3bf4f5SfRwRIH1gziBHi6+4f5OX04MC62SgGfLyx6/++lZP+t5Zl/J/bXfW/Ji/xf3NJ2msFUQUJFANAHEUZGbNVs7p/f7i24//DE2vABr26uOV/V3X2/xXTmv6vntny/+mZ9f+DvVyOg9RjGMDAwMAU7uf5+svdw/8fn173f+eSPrAhz89u+H9+5/z/1w8s/V9XnPFOS0d3PYYBipKS8pq6Rlf1LBx/luVnfLu8b+mfoxtm/M9Livi/bEr95zndlQ99XeyfG+safjXzDP2joWc8EewCkK0qalptuhZ2n5xSq//bxpf8949MftvZ0fmpWE/302xDvdfhWpovIh1sLs0wNvwy2djwl4l/3H8je5+v8vLykgyK0tL6xq5Bv0AajQOT/hsHJIKxkV/cf6Di55ctjP/vMjP6mGBg8KpNT/fNRGPDH0be0f+1LOzPgSwHYgZmQzuPN9YxBXDNMENyTMxuzjHUuR1o53Bqx7Ztv2bPnvsivLjhi4Fr0H8NA/PVIC8AAIYxhprDzOWMAAAAAElFTkSuQmCC">Dashboard [Jenkins]</A>
24
+ </DL><p>
25
+ </DL><p>
26
+ </DL><p>
@@ -0,0 +1,36 @@
1
+ <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
+ <!-- This is an automatically generated file.
3
+ It will be read and overwritten.
4
+ DO NOT EDIT! -->
5
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
6
+ <TITLE>Bookmarks</TITLE>
7
+ <H1>Bookmarks Menu</H1>
8
+
9
+ <DL><p>
10
+ <DT><A HREF="place:folder=BOOKMARKS_MENU&folder=UNFILED_BOOKMARKS&folder=TOOLBAR&sort=12&excludeQueries=1&maxResults=10&queryType=1">Recently Bookmarked</A>
11
+ <DT><A HREF="place:sort=14&type=6&maxResults=10&queryType=1">Recent Tags</A>
12
+ <HR>
13
+ <DT><H3 ADD_DATE="1350925942" LAST_MODIFIED="1350926088" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
14
+ <DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
15
+ <DL><p>
16
+ <DT><A HREF="place:sort=8&maxResults=10">Most Visited</A>
17
+ <DT><A HREF="http://www.mozilla.com/en-US/firefox/central/" ADD_DATE="1350925942" LAST_MODIFIED="1350925942">Getting Started</A>
18
+ <DT><H3 ADD_DATE="1350925975" LAST_MODIFIED="1350926025">Nest 1</H3>
19
+ <DD>Test nest 1
20
+ <DL><p>
21
+ <DT><A HREF="http://www.google.lt/" ADD_DATE="1350926012" LAST_MODIFIED="1350926012" ICON_URI="http://www.google.lt/favicon.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVQ4jaXTPUvDQBgH8HyzkiCVdlBcFD+CDgUn0bU5rUMRS6mD4BuCVgfFKmitCl0s+FKhvoEgVvsyWKuRS9JLcvm7tcplSHW44e6e5/c8x91JAaKFZJXWFELRzZBVWgsQLST9JfknInlt9ExRJLMMqSOG67ID7gLb5xbG100h1hNIFyzM51gbu61wnN7Znl14Al+GC7LTas9nMi20bPgHPnUXmatOxbE1E89v3D8wd8DAbGBiw0R/XMfupY3RJcM/oBCKkUUDiUMGF/h1HN+AQiiC0xSa4aL04mBgVvcPTKZNbBYspHIMy3mGJnXx+s4xmBARAVg4Ybh4ctAb66wNJXSUGxx7RfEqBaDa5EgdMSEwmWXIlnwA+Qcb5QbHcLLTbjBGcfboILLq4yX2xXVsFSzUP1zcVzmOb2zsF21EVsRkhVD89zPVJTmqhWWV1rsGVFqRo1r4G6iM33AbQTj+AAAAAElFTkSuQmCC">Google</A>
22
+ <DT><H3 ADD_DATE="1350926018" LAST_MODIFIED="1350926045">Nest 2</H3>
23
+ <DL><p>
24
+ <DT><A HREF="http://www.yahoo.com/" ADD_DATE="1350926033" LAST_MODIFIED="1350926033" ICON_URI="http://www.yahoo.com/favicon.ico" ICON="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA" LAST_CHARSET="UTF-8">Yahoo!</A>
25
+ <DD>Welcome to Yahoo!, the world&#39;s most visited home page. Quickly find what you&#39;re searching for, get in touch with friends and stay in-the-know with the latest news and information.
26
+ </DL><p>
27
+ </DL><p>
28
+ <DT><H3 ADD_DATE="1350925942" LAST_MODIFIED="1350925942">Mozilla Firefox</H3>
29
+ <DL><p>
30
+ <DT><A HREF="http://www.mozilla.com/en-US/firefox/help/" ADD_DATE="1350925942" LAST_MODIFIED="1350925942" ICON_URI="http://www.mozilla.org/2005/made-up-favicon/0-1350925942950" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==">Help and Tutorials</A>
31
+ <DT><A HREF="http://www.mozilla.com/en-US/firefox/customize/" ADD_DATE="1350925942" LAST_MODIFIED="1350925942" ICON_URI="http://www.mozilla.org/2005/made-up-favicon/1-1350925942951" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==">Customize Firefox</A>
32
+ <DT><A HREF="http://www.mozilla.com/en-US/firefox/community/" ADD_DATE="1350925942" LAST_MODIFIED="1350925942" ICON_URI="http://www.mozilla.org/2005/made-up-favicon/2-1350925942952" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==">Get Involved</A>
33
+ <DT><A HREF="http://www.mozilla.com/en-US/about/" ADD_DATE="1350925942" LAST_MODIFIED="1350925942" ICON_URI="http://www.mozilla.org/2005/made-up-favicon/3-1350925942953" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==">About Us</A>
34
+ </DL><p>
35
+ </DL><p>
36
+ </DL><p>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE NETSCAPE-Bookmark-file-1>
2
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
3
+ <!-- This is an automatically generated file.
4
+ It will be read and overwritten.
5
+ Do Not Edit! -->
6
+ <TITLE>Bookmarks</TITLE>
7
+ <H1>Bookmarks</H1>
8
+ <DL><p>
9
+ <DT><A HREF="https://saveit.in/" ADD_DATE="1350743281" LAST_VISIT="1350743282" LAST_MODIFIED="1350743283" PRIVATE="0" TAGS="Bookmarking">Save It - Simple, secure bookmarks</A>
10
+ </DL><p>
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+
4
+ module Markio
5
+ describe Builder do
6
+ it 'should build empty bookmarks' do
7
+ builder = Builder.new
8
+ file_contents = builder.build_string
9
+ file_contents.length.should_not be_nil
10
+ file_contents.should match "DOCTYPE NETSCAPE-Bookmark-file-1"
11
+ end
12
+
13
+ it 'should build single bookmark without tags' do
14
+ builder = Builder.new
15
+ builder.bookmarks << Bookmark.create({
16
+ :title => "Test bookmark",
17
+ :href => "http://test.com",
18
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
19
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
20
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
21
+ })
22
+ file_contents = builder.build_string
23
+ file_contents.length.should_not be_nil
24
+ file_contents.should match "Test bookmark"
25
+ file_contents.should match "test\.com"
26
+ file_contents.should match "add_date"
27
+ file_contents.should match "last_visit"
28
+ file_contents.should match "last_modified"
29
+ end
30
+
31
+
32
+ it 'should be able to parse what it builds' do
33
+ builder = Builder.new
34
+ builder.bookmarks << Bookmark.create({
35
+ :title => "Test bookmark 1",
36
+ :href => "http://test.com"
37
+ })
38
+ builder.bookmarks << Bookmark.create({
39
+ :title => "Test bookmark 2",
40
+ :href => "http://test2.com",
41
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
42
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
43
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
44
+ })
45
+ file_contents = builder.build_string
46
+ bookmarks = Markio.parse file_contents
47
+ bookmarks.length.should eq builder.bookmarks.length
48
+ bookmarks.each do |b|
49
+ builder.bookmarks.should include b
50
+ end
51
+ end
52
+
53
+ it 'should be reflexive' do
54
+ builder = Builder.new
55
+ builder.bookmarks << Bookmark.create({
56
+ :title => "Test bookmark",
57
+ :href => "http://test1.com"
58
+ })
59
+ builder.bookmarks << Bookmark.create({
60
+ :title => "Test bookmark 2",
61
+ :href => "http://test2.com",
62
+ :add_date => Date.parse('2012-01-12 11:22:33').to_datetime,
63
+ :last_visit => Date.parse('2012-01-13 10:20:30').to_datetime,
64
+ :last_modified => Date.parse('2012-01-14 10:21:31').to_datetime
65
+ })
66
+ file_contents = builder.build_string
67
+ bookmarks = Markio.parse file_contents
68
+ builder = Builder.new
69
+ builder.bookmarks = bookmarks
70
+ builder.build_string.should eq file_contents
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
120
+ end
121
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ module Markio
4
+ describe Parser do
5
+ it 'should parse single bookmark' do
6
+ bookmarks = Markio.parse File.open "spec/assets/one_bookmark.html"
7
+
8
+ bookmarks.should_not be_nil
9
+ bookmarks.class.should be Array
10
+ bookmarks.length.should eq 1
11
+ bookmark = bookmarks[0]
12
+ bookmark.title.should eq 'Save It - Simple, secure bookmarks'
13
+ bookmark.href.should eq 'https://saveit.in/'
14
+ bookmark.folders.length.should eq 1
15
+ bookmark.folders.first.should eq "Bookmarking"
16
+ bookmark.add_date.should_not be_nil
17
+ bookmark.last_visit.should_not be_nil
18
+ bookmark.last_modified.should_not be_nil
19
+ bookmark.add_date.class.should be DateTime
20
+ bookmark.last_visit.class.should be DateTime
21
+ bookmark.last_modified.class.should be DateTime
22
+ end
23
+
24
+ it 'should parse multiple bookmarks' do
25
+ bookmarks = Markio.parse File.open "spec/assets/many_bookmarks.html"
26
+ bookmarks.length.should eq 11
27
+ bookmarks.first.folders.length.should eq 1
28
+ bookmarks.first.folders.first.should eq "Bookmarks Bar"
29
+ bookmarks.last.folders.length.should eq 2
30
+ end
31
+
32
+ it 'should parse delicious bookmarks' do
33
+ bookmarks = Markio.parse File.open "spec/assets/delicious_bookmarks.html"
34
+ bookmarks.length.should eq 5
35
+ bookmarks.first.folders.length.should eq 5
36
+ bookmarks.first.folders.first.should eq "food"
37
+ bookmarks.last.folders.length.should eq 3
38
+ end
39
+
40
+ it 'should parse nested bookmarks' do
41
+ bookmarks = Markio.parse File.open "spec/assets/nested_bookmarks.html"
42
+
43
+ bookmarks.length.should eq 10
44
+ bookmarks.first.folders.length.should eq 0
45
+ bookmarks.last.folders.length.should eq 2
46
+ end
47
+
48
+ it 'should raise error for non existing files' do
49
+ expect { Markio.parse File.open "spec/assets/not_found.html" }.to raise_error
50
+ end
51
+
52
+ it 'should handle corrupted data' do
53
+ bookmarks = Markio.parse File.open "spec/assets/corrupted.html"
54
+ bookmarks.should eq []
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+ require 'markio'
3
+ require 'pry'
4
+ require 'pry-nav'
5
+
6
+ RSpec.configure do |config|
7
+ config.color_enabled = true
8
+ config.formatter = 'documentation'
9
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hippomarkio
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - hippohack
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
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: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-nav
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: guard-rspec
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: Import/export utility for Netscape Bookmark Format
70
+ email:
71
+ - benzoh.g@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - Guardfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - hippomarkio.gemspec
84
+ - lib/markio.rb
85
+ - lib/markio/bookmark.rb
86
+ - lib/markio/builder.rb
87
+ - lib/markio/parser.rb
88
+ - lib/markio/version.rb
89
+ - spec/assets/corrupted.html
90
+ - spec/assets/delicious_bookmarks.html
91
+ - spec/assets/many_bookmarks.html
92
+ - spec/assets/nested_bookmarks.html
93
+ - spec/assets/one_bookmark.html
94
+ - spec/builder_spec.rb
95
+ - spec/parser_spec.rb
96
+ - spec/spec_helper.rb
97
+ homepage: https://github.com/hippohack/hippomarkio
98
+ licenses: []
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.1.2
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Handles parsing and building Netscabe Bookmark Format in Ruby way.
119
+ test_files:
120
+ - spec/assets/corrupted.html
121
+ - spec/assets/delicious_bookmarks.html
122
+ - spec/assets/many_bookmarks.html
123
+ - spec/assets/nested_bookmarks.html
124
+ - spec/assets/one_bookmark.html
125
+ - spec/builder_spec.rb
126
+ - spec/parser_spec.rb
127
+ - spec/spec_helper.rb