booker 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7e03cf87b4d4677e8ee2cd82e676e2c37e328c53
4
+ data.tar.gz: 67c4a45af1cd4f92b9cf47c01e368bc0a3de5aff
5
+ SHA512:
6
+ metadata.gz: e3b1ff12d26bd927a4cfbccd737f9cc9b3ede569ec955529ac5b4a729aafe2a29be87597f291765e6a9a1216f3c57a89118999d16df99cda6a98ffdab38b868e
7
+ data.tar.gz: cebe4d14c2d95831891035056d5e9567e4435c0e3ed70eeffdedc30ca24777b1dede6146b75ae6d1d62e11df4f8eedc7fe8cedaeff15ede44e033ad1eb5d532d
data/bin/web ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require_relative "../lib/booker"
5
+
6
+
7
+ # web by jeremy warner
8
+ # open up a website or search in google chrome from cli
9
+ # also show and/or open up google chrome bookmarks
10
+
11
+
12
+ VERSION = "0.1"
13
+ HELP_BANNER = <<-EOS
14
+ Open browser:
15
+ $ web [options]
16
+ Options:
17
+ --bookmark, -b: explicity open bookmark
18
+ --search, -s: explicity open search
19
+ --complete: show completions
20
+ EOS
21
+
22
+
23
+ Booker.new(ARGV)
data/lib/booker.rb ADDED
@@ -0,0 +1,75 @@
1
+ # parse command line args
2
+
3
+
4
+ require_relative 'bookmarks'
5
+ require_relative 'browser'
6
+
7
+
8
+ # get web opening command
9
+ class Booker
10
+ include Browser
11
+ def initialize(args)
12
+ parse args
13
+ end
14
+
15
+ def parse(args)
16
+ if args.none? # no args given, show help
17
+ puts HELP_BANNER
18
+ exit 1
19
+ end
20
+
21
+ # doing autocompletion
22
+ if args[0] == "--complete"
23
+ args.shift # remove flag
24
+ allargs = args.join(' ')
25
+ bm = Bookmarks.new(allargs)
26
+ bm.autocomplete
27
+ exit 0
28
+ end
29
+
30
+
31
+ # doing forced bookmarking
32
+ if args[0] == "--bookmark" or args[0] == "-b"
33
+ bm = Bookmarks.new('')
34
+ bookmark = bm.bookmark_id(args[1])
35
+ url = bm.bookmark_url(bookmark)
36
+ puts 'opening ' + url + '...'
37
+ exec browse << wrap(url)
38
+ exit 0
39
+ end
40
+
41
+
42
+ # doing forced searching
43
+ if args[0] == "--search" or args[0] == "-s"
44
+ args.shift # remove flag
45
+ puts 'searching ' + allargs + '...'
46
+ exec browse << search << allargs
47
+ exit 0
48
+ end
49
+
50
+
51
+ # interpret
52
+ while args do
53
+ allargs = "'" + args.join(' ') + "'"
54
+ browsearg = args.shift
55
+
56
+ if /[0-9]/.match(browsearg[0]) # bookmark
57
+ bm = Bookmarks.new('')
58
+ bookmark = bm.bookmark_id(browsearg)
59
+ url = bm.bookmark_url(bookmark)
60
+ puts 'opening ' + url + '...'
61
+ exec browse << wrap(url)
62
+
63
+ elsif domain.match(browsearg) # website
64
+ puts 'opening ' + browsearg + '...'
65
+ exec browse << wrap(prep(browsearg))
66
+
67
+ else # just search for these arguments
68
+ puts 'searching ' + allargs + '...'
69
+ exec browse << search << allargs
70
+
71
+ end
72
+ end
73
+ end
74
+ end
75
+
data/lib/bookmarks.rb ADDED
@@ -0,0 +1,142 @@
1
+ # grab bookmarks from json file on computer - this may need to be changed based
2
+ # on operating system as well
3
+
4
+
5
+ require "rubygems"
6
+ require "json"
7
+ require_relative "folder"
8
+
9
+
10
+ # get the width of the current terminal # [columns, lines]
11
+ #require "highline"
12
+ #COLWIDTH = HighLine::SystemExtensions.terminal_size[0]
13
+
14
+ # thx danhassin
15
+ class String
16
+ def colorize(color, mod)
17
+ "\033[#{mod};#{color};49m#{self}\033[0;0m"
18
+ end
19
+
20
+ def window(width)
21
+ if self.length >= width
22
+ self[0..width-1]
23
+ else
24
+ self.ljust(width)
25
+ end
26
+ end
27
+
28
+ def reset() colorize(0,0) end
29
+ def white() colorize(37,1) end
30
+ def green() colorize(32,0) end
31
+ def blue() colorize(34,0) end
32
+ end
33
+
34
+
35
+ class Bookmarks
36
+ LOCAL_BOOKMARKS = "/Library/Application Support/Google/Chrome/Profile 1/bookmarks"
37
+ RAW_JSON_BOOKMARKS = JSON.parse(open(ENV['HOME'] + LOCAL_BOOKMARKS).read)
38
+ CHROME_BOOKMARKS = RAW_JSON_BOOKMARKS['roots']['bookmark_bar']['children']
39
+
40
+ def initialize(search_term)
41
+ @searching = /#{search_term}/i
42
+ @allurls = []
43
+ parse
44
+ end
45
+
46
+ # output for zsh
47
+ def autocomplete
48
+ width = 80
49
+ @allurls.each do |url|
50
+ # delete anything not allowed in linktitle
51
+ dirty_t = url.title.gsub(/[^a-z0-9\-\/_]/i, '')
52
+ dirty_t = url.folder + dirty_t
53
+ dirty_t = dirty_t.gsub(/\-+/, '-')
54
+ dirty_t = dirty_t.gsub(/ /,'')
55
+ name = dirty_t.window(width)
56
+
57
+ # remove strange things from any linkurls
58
+ dirty_u = url.url.gsub(/[,'"&?].*/, '')
59
+ dirty_u = dirty_u.gsub(/.*:\/+/,'')
60
+ dirty_u = dirty_u.gsub(/ /,'')
61
+ #right = [url.url.length, COLWIDTH-titlewidth].max
62
+ #link = dirty_u[0..right-1]
63
+ link = dirty_u[0..width]
64
+
65
+ # print out title and cleaned url, for autocompetion
66
+ puts url.id + ":" + name + ":" + link
67
+ end
68
+ end
69
+
70
+
71
+ # parse a bookmark's id from tab completed form
72
+ def bookmark_id(url)
73
+ url[0..5].gsub(/[^0-9]/, '')
74
+ end
75
+
76
+ # get link (from id number)
77
+ def bookmark_url(id)
78
+ bm_url = ''
79
+ @allurls.each do |url|
80
+ bm_url = url.url if id == url.id
81
+ end
82
+ bm_url
83
+ end
84
+
85
+ # recursively parse gc bookmarks
86
+ def parse(root=nil)
87
+ # root - parent folder in ruby
88
+ root = Folder.new CHROME_BOOKMARKS if root.nil?
89
+
90
+ # all current urls, to hash
91
+ root.json.each {|x| parse_link root.title, x }
92
+
93
+ # all next-level folders, to array
94
+ root.json.each {|x| parse_folder root, x }
95
+ end
96
+
97
+ # add link to results
98
+ def parse_link(base, link)
99
+ checking = [base, link['name'], link['url'], link['id']]
100
+ if checking.any? {|x| @searching.match x }
101
+ if link['type'] == 'url'
102
+ @allurls.push(Bookmark.new base, link['name'], link['url'], link['id'])
103
+ end
104
+ end
105
+ end
106
+
107
+ # discover and parse folders
108
+ def parse_folder(base, link)
109
+ if link['type'] == 'folder'
110
+ title = base.title + link['name'] + '/'
111
+ subdir = Folder.new(title, link['children'])
112
+ parse(subdir)
113
+ end
114
+ end
115
+ end
116
+
117
+ # just hold data
118
+ class Bookmark
119
+ # clean bookmark title, set attrs
120
+ def initialize(f, t, u, id)
121
+ @title = t.gsub(/[: ,'"+\-]/, '_').downcase
122
+ @folder = f
123
+ @url = u
124
+ @id = id
125
+ end
126
+
127
+ def folder
128
+ @folder
129
+ end
130
+
131
+ def title
132
+ @title
133
+ end
134
+
135
+ def id
136
+ @id
137
+ end
138
+
139
+ def url
140
+ @url
141
+ end
142
+ end
data/lib/browser.rb ADDED
@@ -0,0 +1,55 @@
1
+ # detect operating system
2
+
3
+ module OS
4
+ def OS.windows?
5
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
6
+ end
7
+
8
+ def OS.mac?
9
+ (/darwin/ =~ RUBY_PLATFORM) != nil
10
+ end
11
+
12
+ def OS.linux?
13
+ not (OS.windows? or OS.mac?)
14
+ end
15
+ end
16
+
17
+
18
+ # return browser (chrome) opening command
19
+
20
+ module Browser
21
+ extend OS
22
+ def browse
23
+ if OS.windows?
24
+ '/cygdrive/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe '
25
+ elsif OS.mac?
26
+ 'open -a "Google Chrome" '
27
+ elsif OS.linix?
28
+ 'xdg-open ' # completely guessing here
29
+ end
30
+ end
31
+
32
+ def domain
33
+ /.*(io|com|web|net|org|gov|edu)$/i
34
+ end
35
+
36
+ def search
37
+ #"https://www.google.com/search?q="
38
+ #"http://www.bing.com/search?q=" #lol
39
+ "https://duckduckgo.com/?q="
40
+ end
41
+
42
+ # helper methods
43
+
44
+ def prep(url)
45
+ if /^http/.match(url)
46
+ url
47
+ else
48
+ 'http://' << url
49
+ end
50
+ end
51
+
52
+ def wrap(url)
53
+ "'" + url + "'"
54
+ end
55
+ end
data/lib/folder.rb ADDED
@@ -0,0 +1,21 @@
1
+ # basic folder class, for parsing bookmarks
2
+
3
+ class Folder
4
+ include Enumerable
5
+ def initialize(title='/', json)
6
+ @title = title.gsub(/[: ,'"]/, '-').downcase
7
+ @json = json
8
+ end
9
+
10
+ def title
11
+ @title
12
+ end
13
+
14
+ def json
15
+ @json
16
+ end
17
+
18
+ def each
19
+ @json.each
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: booker
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Warner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Select your bookmarks from the command line.
28
+ email:
29
+ - jeremywrnr@gmail.com
30
+ executables:
31
+ - web
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - bin/web
36
+ - lib/booker.rb
37
+ - lib/bookmarks.rb
38
+ - lib/browser.rb
39
+ - lib/folder.rb
40
+ homepage: http://rubygems.org/gems/booker
41
+ licenses:
42
+ - MIT
43
+ metadata: {}
44
+ post_install_message:
45
+ rdoc_options: []
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ requirements: []
59
+ rubyforge_project:
60
+ rubygems_version: 2.4.8
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: CLI parser for google chrome bookmarks
64
+ test_files: []