bkmrq 0.0.6 → 0.1.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.
- 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 -83
- 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: []
|