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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +70 -0
  4. data/LICENSE +21 -0
  5. data/README.md +74 -0
  6. data/bin/bkmrq +4 -3
  7. data/bkmrq.gemspec +28 -0
  8. data/lib/bkmrq/application.rb +27 -0
  9. data/lib/bkmrq/bookmark.rb +35 -0
  10. data/lib/bkmrq/cli/app.rb +17 -0
  11. data/lib/bkmrq/cli/arg_parser.rb +90 -0
  12. data/lib/bkmrq/codegen/html_generator.rb +26 -0
  13. data/lib/bkmrq/codegen/markdown_generator.rb +78 -0
  14. data/lib/bkmrq/error.rb +8 -0
  15. data/lib/bkmrq/extractors/brave.rb +29 -0
  16. data/lib/bkmrq/extractors/chrome.rb +29 -0
  17. data/lib/bkmrq/extractors/chromium.rb +30 -0
  18. data/lib/bkmrq/extractors/error.rb +13 -0
  19. data/lib/bkmrq/extractors/extractors.rb +21 -0
  20. data/lib/bkmrq/extractors/firefox.rb +29 -0
  21. data/lib/bkmrq/extractors/opera.rb +29 -0
  22. data/lib/bkmrq/extractors/safari.rb +24 -0
  23. data/lib/bkmrq/filter.rb +14 -0
  24. data/lib/bkmrq/formatters/assets.rb +11 -0
  25. data/lib/bkmrq/formatters/csv.rb +12 -0
  26. data/lib/bkmrq/formatters/formatters.rb +18 -0
  27. data/lib/bkmrq/formatters/html.rb +43 -0
  28. data/lib/bkmrq/formatters/json.rb +28 -0
  29. data/lib/bkmrq/formatters/markdown.rb +50 -0
  30. data/lib/bkmrq/parsers/brave.rb +52 -0
  31. data/lib/bkmrq/parsers/chrome.rb +52 -0
  32. data/lib/bkmrq/parsers/chromium.rb +52 -0
  33. data/lib/bkmrq/parsers/error.rb +13 -0
  34. data/lib/bkmrq/parsers/firefox.rb +19 -0
  35. data/lib/bkmrq/parsers/opera.rb +19 -0
  36. data/lib/bkmrq/parsers/parsers.rb +22 -0
  37. data/lib/bkmrq/parsers/safari.rb +19 -0
  38. data/lib/bkmrq/ui.rb +39 -0
  39. data/lib/bkmrq/writer.rb +12 -0
  40. data/lib/bkmrq.rb +7 -5
  41. metadata +76 -13
  42. data/lib/bkmrq/app.rb +0 -83
  43. data/lib/bkmrq/browser_config.rb +0 -24
  44. data/lib/bkmrq/cli.rb +0 -52
  45. data/lib/bkmrq/docs_template.rb +0 -31
  46. 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
@@ -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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Formatters
4
+ # Markdown Formatter
5
+ module Assets
6
+ # Images
7
+ module Images
8
+ LIBRARY = 'https://raw.githubusercontent.com/sreedevk/bkmrq/development/assets/library.png'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Formatters
4
+ # Markdown Formatter
5
+ class Csv
6
+ attr_accessor :root
7
+
8
+ def initialize(tree)
9
+ @root = tree
10
+ end
11
+ end
12
+ 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../error'
4
+
5
+ module Parsers
6
+ # Extranctor Errors
7
+ class Error < Bkmrq::Error
8
+ def initialize(message)
9
+ @input = message
10
+ super("[BKMRQ ERR] #{input}")
11
+ end
12
+ end
13
+ 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
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bkmrq
4
+ # Writes output to file
5
+ class Writer
6
+ def self.run(formatted_bookmarks, opts)
7
+ File.open(opts[:to], 'w+') do |file|
8
+ file.puts(formatted_bookmarks)
9
+ end
10
+ end
11
+ end
12
+ end
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
- require 'bkmrq/browser_config'
6
- require 'bkmrq/cli'
7
- require 'bkmrq/docs_template'
8
- require 'bkmrq/manual'
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.0.6
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
- - Sreedev Kodichath
7
+ - sreedev <sreedevpadmakumar@gmail.com>
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-05 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Bkmrq Converts Bookmarks stored by your browser in JSON format to a readable
14
- markdown format
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/app.rb
24
- - lib/bkmrq/browser_config.rb
25
- - lib/bkmrq/cli.rb
26
- - lib/bkmrq/docs_template.rb
27
- - lib/bkmrq/manual.rb
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.2.22
111
+ rubygems_version: 3.5.4
49
112
  signing_key:
50
113
  specification_version: 4
51
- summary: Export your browser bookmarks to markdown!
114
+ summary: Cross browser multi-format bookmarks exporter
52
115
  test_files: []