bkmrq 0.0.6 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: []