bkmrq 0.0.5 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +13 -0
- data/Gemfile.lock +70 -0
- data/LICENSE +21 -0
- data/README.md +74 -0
- data/bin/bkmrq +4 -3
- data/bkmrq.gemspec +28 -0
- data/lib/bkmrq/application.rb +27 -0
- data/lib/bkmrq/bookmark.rb +35 -0
- data/lib/bkmrq/cli/app.rb +17 -0
- data/lib/bkmrq/cli/arg_parser.rb +90 -0
- data/lib/bkmrq/codegen/html_generator.rb +26 -0
- data/lib/bkmrq/codegen/markdown_generator.rb +78 -0
- data/lib/bkmrq/error.rb +8 -0
- data/lib/bkmrq/extractors/brave.rb +29 -0
- data/lib/bkmrq/extractors/chrome.rb +29 -0
- data/lib/bkmrq/extractors/chromium.rb +30 -0
- data/lib/bkmrq/extractors/error.rb +13 -0
- data/lib/bkmrq/extractors/extractors.rb +21 -0
- data/lib/bkmrq/extractors/firefox.rb +29 -0
- data/lib/bkmrq/extractors/opera.rb +29 -0
- data/lib/bkmrq/extractors/safari.rb +24 -0
- data/lib/bkmrq/filter.rb +14 -0
- data/lib/bkmrq/formatters/assets.rb +11 -0
- data/lib/bkmrq/formatters/csv.rb +12 -0
- data/lib/bkmrq/formatters/formatters.rb +18 -0
- data/lib/bkmrq/formatters/html.rb +43 -0
- data/lib/bkmrq/formatters/json.rb +28 -0
- data/lib/bkmrq/formatters/markdown.rb +50 -0
- data/lib/bkmrq/parsers/brave.rb +52 -0
- data/lib/bkmrq/parsers/chrome.rb +52 -0
- data/lib/bkmrq/parsers/chromium.rb +52 -0
- data/lib/bkmrq/parsers/error.rb +13 -0
- data/lib/bkmrq/parsers/firefox.rb +19 -0
- data/lib/bkmrq/parsers/opera.rb +19 -0
- data/lib/bkmrq/parsers/parsers.rb +22 -0
- data/lib/bkmrq/parsers/safari.rb +19 -0
- data/lib/bkmrq/ui.rb +39 -0
- data/lib/bkmrq/writer.rb +12 -0
- data/lib/bkmrq.rb +7 -5
- metadata +76 -13
- data/lib/bkmrq/app.rb +0 -84
- data/lib/bkmrq/browser_config.rb +0 -24
- data/lib/bkmrq/cli.rb +0 -52
- data/lib/bkmrq/docs_template.rb +0 -31
- data/lib/bkmrq/manual.rb +0 -65
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'error'
|
4
|
+
|
5
|
+
module Extractors
|
6
|
+
# Chrome Bookmarks Extractor
|
7
|
+
class Opera
|
8
|
+
def self.extract
|
9
|
+
new.extract
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract
|
13
|
+
File.read(bookmarks_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def bookmarks_path
|
17
|
+
case RbConfig::CONFIG['host_os']
|
18
|
+
when /mswin|msys|mingw|cygwin|bccwin|wince/i
|
19
|
+
File.expand_path('~/AppData/Roaming/Opera Software/Opera Stable/Bookmarks')
|
20
|
+
when /darwin|mac os/i
|
21
|
+
File.expand_path('~/Library/Application Support/Opera Software/Opera Stable/Bookmarks')
|
22
|
+
when /linux/i, /solaris|bsd/i
|
23
|
+
File.expand_path('~/.config/opera/Bookmarks')
|
24
|
+
else
|
25
|
+
raise Bkmrq::Extractors::Error, 'bkmrq is not supported on your OS.'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'error'
|
4
|
+
|
5
|
+
module Extractors
|
6
|
+
# Chrome Bookmarks Extractor
|
7
|
+
class Safari
|
8
|
+
def self.extract
|
9
|
+
new.extract
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract
|
13
|
+
File.read(bookmarks_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def bookmarks_path
|
17
|
+
unless /darwin|mac os/i.match?(RbConfig::CONFIG['host_os'])
|
18
|
+
raise Bkmrq::Extractors::Error, 'bkmrq does not support Safari on your OS'
|
19
|
+
end
|
20
|
+
|
21
|
+
File.expand_path('~/Library/Safari/Bookmarks.plist')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/bkmrq/filter.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bkmrq
|
4
|
+
# TODO: Filters out bookmarks that matched the -x regex
|
5
|
+
class Filter
|
6
|
+
def self.run(parsed_file, opts)
|
7
|
+
return parsed_file if opts[:exclude].nil?
|
8
|
+
|
9
|
+
new.filter(parsed_file, opts[:exclude])
|
10
|
+
end
|
11
|
+
|
12
|
+
def filter(parsed_file, patterns); end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Application root module
|
4
|
+
module Bkmrq
|
5
|
+
require_relative 'csv'
|
6
|
+
require_relative 'html'
|
7
|
+
require_relative 'json'
|
8
|
+
require_relative 'markdown'
|
9
|
+
|
10
|
+
# Formats to markdown/html/toml/json
|
11
|
+
class Formatters
|
12
|
+
def self.run(filtered_bookmarks, opts)
|
13
|
+
Object
|
14
|
+
.const_get("Formatters::#{opts[:format].capitalize}")
|
15
|
+
.format(filtered_bookmarks)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../codegen/html_generator'
|
4
|
+
|
5
|
+
module Formatters
|
6
|
+
# Html Formatter
|
7
|
+
class Html
|
8
|
+
def self.format(tree)
|
9
|
+
new.format!(tree)
|
10
|
+
end
|
11
|
+
|
12
|
+
def format!(tree)
|
13
|
+
format([], tree)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def format_directory(cache, node, level)
|
19
|
+
cache << Codegen::HtmlGenerator.div do
|
20
|
+
[
|
21
|
+
Codegen::HtmlGenerator.header(node.name, level),
|
22
|
+
node.children.map { |child_node| format([], child_node, level.next) }
|
23
|
+
].flatten.join("\n")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def format_bookmark(cache, node)
|
28
|
+
cache << Codegen::HtmlGenerator.paragraph do
|
29
|
+
Codegen::HtmlGenerator.link(node.name, node.url)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def format(page_cache, node, level = 1)
|
34
|
+
page_cache.tap do |cache|
|
35
|
+
if node.is_a?(Bkmrq::Bookmark)
|
36
|
+
format_bookmark(cache, node)
|
37
|
+
elsif node.is_a?(Bkmrq::BookmarkDir) && node.children?
|
38
|
+
format_directory(cache, node, level)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../bookmark'
|
4
|
+
|
5
|
+
module Formatters
|
6
|
+
# Json Formatter
|
7
|
+
class Json
|
8
|
+
def self.format(tree)
|
9
|
+
new.format!(tree)
|
10
|
+
end
|
11
|
+
|
12
|
+
def format!(tree)
|
13
|
+
Oj.dump(format([], tree))
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def format(page_cache, node)
|
19
|
+
page_cache.tap do |cache|
|
20
|
+
if node.is_a?(Bkmrq::Bookmark)
|
21
|
+
cache << { name: node.name, url: node.url, type: :bookmark }
|
22
|
+
elsif node.is_a?(Bkmrq::BookmarkDir) && node.children?
|
23
|
+
cache << { name: node.name, children: node.children.map { |child_node| format([], child_node) }, type: :dir }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../bookmark'
|
4
|
+
require_relative '../codegen/markdown_generator'
|
5
|
+
|
6
|
+
# Formatters
|
7
|
+
module Formatters
|
8
|
+
require_relative 'assets'
|
9
|
+
|
10
|
+
# Markdown Formatter
|
11
|
+
class Markdown
|
12
|
+
def self.format(tree)
|
13
|
+
new.format!(tree)
|
14
|
+
end
|
15
|
+
|
16
|
+
def format!(tree)
|
17
|
+
format((method(:add_doc_title) >> method(:add_header_image)).call([]), tree)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def format_dir(cache, node, level)
|
23
|
+
cache.push(Codegen::MarkdownGenerator.title(node.name, level))
|
24
|
+
node.children.each do |child_node|
|
25
|
+
format(cache, child_node, level.next)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def format(page_cache, node, level = 1)
|
30
|
+
page_cache.tap do |cache|
|
31
|
+
if node.is_a?(Bkmrq::BookmarkDir) && node.children?
|
32
|
+
format_dir(cache, node, level)
|
33
|
+
elsif node.is_a?(Bkmrq::Bookmark)
|
34
|
+
cache.push(Codegen::MarkdownGenerator.line(Codegen::MarkdownGenerator.link(node.name, node.url)))
|
35
|
+
else
|
36
|
+
raise Bkmrq::Extractors::Error, "Invalid IR Tree Node Detected: #{node.class}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_doc_title(page_cache)
|
42
|
+
text = "#{ENV.fetch('USER', 'Bkmrq User').capitalize}'s Bookmarks"
|
43
|
+
page_cache.push(Codegen::MarkdownGenerator.title(text))
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_header_image(page_cache)
|
47
|
+
page_cache.push(Codegen::MarkdownGenerator.image(Assets::Images::LIBRARY, 'library'))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
require_relative '../bookmark'
|
5
|
+
|
6
|
+
module Parsers
|
7
|
+
# Brave Bookmarks Parser
|
8
|
+
class Brave
|
9
|
+
attr_accessor :rawdata
|
10
|
+
|
11
|
+
def initialize(rawdata)
|
12
|
+
@rawdata = rawdata
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
Oj.load(rawdata).fetch('roots', {}).then { |roots| parse(Bkmrq::BookmarkDir.new('*'), roots.values) }
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def bookmark?(node)
|
22
|
+
node['type'].eql?('url')
|
23
|
+
end
|
24
|
+
|
25
|
+
def folder?(node)
|
26
|
+
node['type'].eql?('folder')
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_bookmark(node, dir)
|
30
|
+
dir.add_child Bkmrq::Bookmark.new(node.slice('guid', 'name', 'url', 'date_added', 'id').transform_keys(&:to_sym))
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_folder(node, dir)
|
34
|
+
Bkmrq::BookmarkDir.new(node['name']).tap do |new_base_dir|
|
35
|
+
dir.add_child(new_base_dir)
|
36
|
+
parse(new_base_dir, node['children'])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse(base_dir, tree)
|
41
|
+
base_dir.tap do |dir|
|
42
|
+
tree.map do |node|
|
43
|
+
if bookmark?(node)
|
44
|
+
parse_bookmark(node, dir)
|
45
|
+
elsif folder?(node) && node['children'].any?
|
46
|
+
parse_folder(node, dir)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
require_relative '../bookmark'
|
5
|
+
|
6
|
+
module Parsers
|
7
|
+
# Chrome Bookmarks Parser
|
8
|
+
class Chrome
|
9
|
+
attr_accessor :rawdata
|
10
|
+
|
11
|
+
def initialize(rawdata)
|
12
|
+
@rawdata = rawdata
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
Oj.load(rawdata).fetch('roots', {}).then { |roots| parse(Bkmrq::BookmarkDir.new('*'), roots.values) }
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def bookmark?(node)
|
22
|
+
node['type'].eql?('url')
|
23
|
+
end
|
24
|
+
|
25
|
+
def folder?(node)
|
26
|
+
node['type'].eql?('folder')
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_bookmark(node, dir)
|
30
|
+
dir.add_child Bkmrq::Bookmark.new(node.slice('guid', 'name', 'url', 'date_added', 'id').transform_keys(&:to_sym))
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_folder(node, dir)
|
34
|
+
Bkmrq::BookmarkDir.new(node['name']).tap do |new_base_dir|
|
35
|
+
dir.add_child(new_base_dir)
|
36
|
+
parse(new_base_dir, node['children'])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse(base_dir, tree)
|
41
|
+
base_dir.tap do |dir|
|
42
|
+
tree.map do |node|
|
43
|
+
if bookmark?(node)
|
44
|
+
parse_bookmark(node, dir)
|
45
|
+
elsif folder?(node) && node['children'].any?
|
46
|
+
parse_folder(node, dir)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
require_relative '../bookmark'
|
5
|
+
|
6
|
+
module Parsers
|
7
|
+
# Chromium Bookmarks Parser
|
8
|
+
class Chromium
|
9
|
+
attr_accessor :rawdata
|
10
|
+
|
11
|
+
def initialize(rawdata)
|
12
|
+
@rawdata = rawdata
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
Oj.load(rawdata).fetch('roots', {}).then { |roots| parse(Bkmrq::BookmarkDir.new('*'), roots.values) }
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def bookmark?(node)
|
22
|
+
node['type'].eql?('url')
|
23
|
+
end
|
24
|
+
|
25
|
+
def folder?(node)
|
26
|
+
node['type'].eql?('folder')
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_bookmark(node, dir)
|
30
|
+
dir.add_child Bkmrq::Bookmark.new(node.slice('guid', 'name', 'url', 'date_added', 'id').transform_keys(&:to_sym))
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_folder(node, dir)
|
34
|
+
Bkmrq::BookmarkDir.new(node['name']).tap do |new_base_dir|
|
35
|
+
dir.add_child(new_base_dir)
|
36
|
+
parse(new_base_dir, node['children'])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def parse(base_dir, tree)
|
41
|
+
base_dir.tap do |dir|
|
42
|
+
tree.map do |node|
|
43
|
+
if bookmark?(node)
|
44
|
+
parse_bookmark(node, dir)
|
45
|
+
elsif folder?(node) && node['children'].any?
|
46
|
+
parse_folder(node, dir)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
|
5
|
+
module Parsers
|
6
|
+
# Brave Bookmarks Parser
|
7
|
+
class Firefox
|
8
|
+
attr_accessor :rawdata
|
9
|
+
|
10
|
+
def initialize(rawdata)
|
11
|
+
@rawdata = rawdata
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
Oj.load(rawdata)
|
16
|
+
.then { |parsed_bookmarks| parsed_bookmarks['roots'] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
|
5
|
+
module Parsers
|
6
|
+
# Brave Bookmarks Parser
|
7
|
+
class Opera
|
8
|
+
attr_accessor :rawdata
|
9
|
+
|
10
|
+
def initialize(rawdata)
|
11
|
+
@rawdata = rawdata
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
Oj.load(rawdata)
|
16
|
+
.then { |parsed_bookmarks| parsed_bookmarks['roots'] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Main Module
|
4
|
+
module Bkmrq
|
5
|
+
require_relative 'brave'
|
6
|
+
require_relative 'chrome'
|
7
|
+
require_relative 'chromium'
|
8
|
+
require_relative 'firefox'
|
9
|
+
require_relative 'opera'
|
10
|
+
require_relative 'safari'
|
11
|
+
require_relative 'error'
|
12
|
+
|
13
|
+
# Parse Raw Browser Bookmarks
|
14
|
+
module Parsers
|
15
|
+
def self.run(rawdata, opts)
|
16
|
+
Object
|
17
|
+
.const_get("Parsers::#{opts[:browser].capitalize}")
|
18
|
+
.new(rawdata)
|
19
|
+
.run
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oj'
|
4
|
+
|
5
|
+
module Parsers
|
6
|
+
# Brave Bookmarks Parser
|
7
|
+
class Safari
|
8
|
+
attr_accessor :rawdata
|
9
|
+
|
10
|
+
def initialize(rawdata)
|
11
|
+
@rawdata = rawdata
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
Oj.load(rawdata)
|
16
|
+
.then { |parsed_bookmarks| parsed_bookmarks['roots'] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/bkmrq/ui.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bkmrq
|
4
|
+
module Ui
|
5
|
+
BANNER = <<-BNR
|
6
|
+
___ __
|
7
|
+
/ _ )/ /__ __ _ _______ _
|
8
|
+
/ _ / '_// ' \\/ __/ _ `/
|
9
|
+
/____/_/\\_\\/_/_/_/_/ \\_, /
|
10
|
+
/_/
|
11
|
+
BNR
|
12
|
+
|
13
|
+
USAGE = <<-USG
|
14
|
+
# Examples
|
15
|
+
--------------------------------
|
16
|
+
# Export Bookmarks from Brave Browser in Markdown format
|
17
|
+
$ bkmrq export --to=brave_bookmarks.md --browser=brave --format=markdown
|
18
|
+
|
19
|
+
# Export Bookmarks from Chromium Browser
|
20
|
+
# in Markdown format & exclude bookmarks/folders with the word "php" and "java"
|
21
|
+
$ bkmrq export --to=chromium_books.md --browser=chromium --format=markdown --exclude="php,java"
|
22
|
+
--------------------------------
|
23
|
+
|
24
|
+
# Supported Browsers(--browser=)
|
25
|
+
- brave
|
26
|
+
- chromium
|
27
|
+
- chrome
|
28
|
+
- firefox
|
29
|
+
- opera
|
30
|
+
- safari (mac only)
|
31
|
+
|
32
|
+
# Supported Export Formats (--format=)
|
33
|
+
- markdown
|
34
|
+
- json
|
35
|
+
- html
|
36
|
+
- csv
|
37
|
+
USG
|
38
|
+
end
|
39
|
+
end
|
data/lib/bkmrq/writer.rb
ADDED
data/lib/bkmrq.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Main Application Namespace
|
3
4
|
module Bkmrq
|
4
|
-
require 'bkmrq/app'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
require 'bkmrq/cli/app'
|
6
|
+
VERSION = '0.1.1'
|
7
|
+
|
8
|
+
def self.init
|
9
|
+
Bkmrq::Cli::App.run!
|
10
|
+
end
|
9
11
|
end
|
metadata
CHANGED
@@ -1,30 +1,93 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bkmrq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- sreedev <sreedevpadmakumar@gmail.com>
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2024-01-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oj
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.14.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.14.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: progress_bar
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.3.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.3.3
|
41
|
+
description: |
|
42
|
+
The Bookmark Exporter CLI is a command-line tool for organizing and transferring
|
43
|
+
bookmarks across multiple browsers including Chrome, Firefox, Safari, and Opera.
|
44
|
+
With just a few simple commands, export bookmarks in JSON, Markdown, CSV, and HTML formats.
|
45
|
+
Ideal for automated scripts and command line users, it's fast and efficient.
|
15
46
|
email: sreedevpadmakumar@gmail.com
|
16
47
|
executables:
|
17
48
|
- bkmrq
|
18
49
|
extensions: []
|
19
50
|
extra_rdoc_files: []
|
20
51
|
files:
|
52
|
+
- Gemfile
|
53
|
+
- Gemfile.lock
|
54
|
+
- LICENSE
|
55
|
+
- README.md
|
21
56
|
- bin/bkmrq
|
57
|
+
- bkmrq.gemspec
|
22
58
|
- lib/bkmrq.rb
|
23
|
-
- lib/bkmrq/
|
24
|
-
- lib/bkmrq/
|
25
|
-
- lib/bkmrq/cli.rb
|
26
|
-
- lib/bkmrq/
|
27
|
-
- lib/bkmrq/
|
59
|
+
- lib/bkmrq/application.rb
|
60
|
+
- lib/bkmrq/bookmark.rb
|
61
|
+
- lib/bkmrq/cli/app.rb
|
62
|
+
- lib/bkmrq/cli/arg_parser.rb
|
63
|
+
- lib/bkmrq/codegen/html_generator.rb
|
64
|
+
- lib/bkmrq/codegen/markdown_generator.rb
|
65
|
+
- lib/bkmrq/error.rb
|
66
|
+
- lib/bkmrq/extractors/brave.rb
|
67
|
+
- lib/bkmrq/extractors/chrome.rb
|
68
|
+
- lib/bkmrq/extractors/chromium.rb
|
69
|
+
- lib/bkmrq/extractors/error.rb
|
70
|
+
- lib/bkmrq/extractors/extractors.rb
|
71
|
+
- lib/bkmrq/extractors/firefox.rb
|
72
|
+
- lib/bkmrq/extractors/opera.rb
|
73
|
+
- lib/bkmrq/extractors/safari.rb
|
74
|
+
- lib/bkmrq/filter.rb
|
75
|
+
- lib/bkmrq/formatters/assets.rb
|
76
|
+
- lib/bkmrq/formatters/csv.rb
|
77
|
+
- lib/bkmrq/formatters/formatters.rb
|
78
|
+
- lib/bkmrq/formatters/html.rb
|
79
|
+
- lib/bkmrq/formatters/json.rb
|
80
|
+
- lib/bkmrq/formatters/markdown.rb
|
81
|
+
- lib/bkmrq/parsers/brave.rb
|
82
|
+
- lib/bkmrq/parsers/chrome.rb
|
83
|
+
- lib/bkmrq/parsers/chromium.rb
|
84
|
+
- lib/bkmrq/parsers/error.rb
|
85
|
+
- lib/bkmrq/parsers/firefox.rb
|
86
|
+
- lib/bkmrq/parsers/opera.rb
|
87
|
+
- lib/bkmrq/parsers/parsers.rb
|
88
|
+
- lib/bkmrq/parsers/safari.rb
|
89
|
+
- lib/bkmrq/ui.rb
|
90
|
+
- lib/bkmrq/writer.rb
|
28
91
|
homepage: https://rubygems.org/gems/bkmrq
|
29
92
|
licenses:
|
30
93
|
- MIT
|
@@ -45,8 +108,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
45
108
|
- !ruby/object:Gem::Version
|
46
109
|
version: '0'
|
47
110
|
requirements: []
|
48
|
-
rubygems_version: 3.
|
111
|
+
rubygems_version: 3.5.4
|
49
112
|
signing_key:
|
50
113
|
specification_version: 4
|
51
|
-
summary:
|
114
|
+
summary: Cross browser multi-format bookmarks exporter
|
52
115
|
test_files: []
|