curldown 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/curldown.rb +122 -44
  3. metadata +16 -18
  4. data/bin/curldown +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: faf1037d47a00b4421406688e60aa4f76b38f698e05137fc7dae55658a47fb5d
4
- data.tar.gz: 7f1a0b8e42701b2da7965b3c4abbd498b9e3561be6185859e60f946a10581f01
3
+ metadata.gz: 8ac6237f445424ea2890467651d8562fb7ceb4fb539e0d4617623c5c74c709d6
4
+ data.tar.gz: 7c7eb51380d773a0554227823c92b5fdb7d2ded8cece4b7a064a6e8f460c7c19
5
5
  SHA512:
6
- metadata.gz: a705f0ab5288aa9d00a59b7e793f89a24f6cb081beef8ebea6a4e5a50f768d208ece7c962f1e26690a47451638679e7cfeeb7ff7c5eb15bb23950815d2d5bed2
7
- data.tar.gz: 48ad2e1973e4f36af20f62a10a64f521c5f3e52b88460cdf79149f683639f532a49ef4e6f4e529c4066cb9c613f15c6de27d494e49f3dd4a8f912e8de59508be
6
+ metadata.gz: c8a020822385969123c0c260be7cc2af3d7c2187826070111c73fecdfa73c97d9e13230875f32d701641d1b5a63961530eb3bb09fb9213a3954b30885e725d0f
7
+ data.tar.gz: 65b99e433ee55ea84bf6d251c509ae7a6f05c4c55ea39397be7bf519f5923d98af1ef59b847af03cb739389ebe6fdf292a75fb7cdcbb8bfc8df1215c6cf8e7e7
@@ -1,43 +1,60 @@
1
- ['curb','github/markdown','nokogiri','pygments.rb'].each do |gem| require gem end
2
- class Curldown
3
- @@lexers = []
4
- Pygments.lexers.each do |a|
5
- @@lexers << a[1][:aliases]
1
+ require 'curb'
2
+ require 'json'
3
+ require 'redcarpet'
4
+ require 'nokogiri'
5
+ require 'pygments.rb'
6
+ module Curldown
7
+ def self.render(user: false, repo: false, url: false, github: false, bitbucket: false)
8
+ instance = Render.new(user: user, repo: repo, url: url, github: github, bitbucket: bitbucket)
9
+ instance.render
10
+ instance.highlight!
11
+ instance
6
12
  end
7
- @@lexers.flatten!
8
- def initialize
9
- @options = {:user => nil, :repo => nil, :branch => "master", :file => "readme.md", :url => nil}
10
- end
11
- def options
12
- @options
13
- end
14
- def options=(options)
15
- @options.merge!(options)
16
- end
17
- def get(*options)
18
- if !options.empty?
19
- @options.merge!(options[0])
20
- end
21
- if @options[:url]
22
- fetch(@options[:url])
23
- else
24
- fetch("https://raw.github.com/#{@options[:user]}/#{@options[:repo]}/#{@options[:branch]}/#{@options[:file]}")
25
- end
26
- end
27
- def check_response_code(url)
28
- if Curl.get(url).response_code == 200
29
- true
13
+ def get(url, json: true)
14
+ http = Curl::Easy.new(url)
15
+ http.perform
16
+ if http.status[0] == "2"
17
+ if json
18
+ response = JSON.parse(http.body_str)
19
+ else
20
+ response = http.body_str
21
+ end
30
22
  else
31
- false
23
+ raise StandardError.new("get method returned #{http.status} code when calling #{http.url}")
32
24
  end
25
+ response
33
26
  end
34
- def fetch(url)
35
- if check_response_code(url)
36
- html = GitHub::Markdown.render_gfm(Curl.get(url).body_str)
37
- doc = Nokogiri::HTML(html)
27
+ class Render
28
+ attr_accessor :user, :repo, :url, :github, :bitbucket, :raw, :html
29
+ def initialize(user: false, repo: false, url: false, github: false, bitbucket: false)
30
+ if url
31
+ @raw = get(url, json: false)
32
+ else
33
+ if github
34
+ req = GitHub.new(user, repo)
35
+ elsif bitbucket
36
+ req = BitBucket.new(user, repo)
37
+ else
38
+ raise StandardError.new("Must specify either: github, bitbucket or url parameters.")
39
+ end
40
+ req.perform
41
+ @raw= req.readme_md
42
+ end
43
+ end
44
+ def render
45
+ md = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
46
+ @html= md.render(@raw)
47
+ end
48
+ def highlight!
49
+ lexers = []
50
+ Pygments.lexers.each do |k,v|
51
+ lexers << v[:aliases]
52
+ end
53
+ lexers.flatten!
54
+ doc = Nokogiri::HTML(@html)
38
55
  doc.css("pre").each do |pre|
39
- if @@lexers.include?(pre.attributes["lang"].value)
40
- lang = pre.attributes["lang"].value
56
+ if lexers.include?(pre.children[0].attributes['class'].value)
57
+ lang = pre.children[0].attributes['class'].value
41
58
  else
42
59
  lang = "sh"
43
60
  end
@@ -46,16 +63,77 @@ class Curldown
46
63
  pre.add_next_sibling(parsed)
47
64
  pre.remove
48
65
  end
49
- doc.css("body").children.to_html
50
- else
51
- raise "#{url} is responding with a 404 error"
66
+ @html = doc.css("body").children.to_html
52
67
  end
68
+
53
69
  end
54
- def url_path
55
- if @options[:url]
56
- @options[:url]
57
- else
58
- "https://raw.github.com/#{@options[:user]}/#{@options[:repo]}/#{@options[:branch]}/#{@options[:file]}"
70
+ class GitHub
71
+ include Curldown
72
+ CORE_URL = "https://raw.githubusercontent.com"
73
+ attr_accessor :user, :repo_name, :readme_md
74
+ def initialize(u, r)
75
+ @user= u
76
+ @repo_name= r
77
+ end
78
+ def perform
79
+ get_readme
80
+ end
81
+ def get_readme
82
+ ["readme.md", "README.md", "README.MD", "Readme.md"].each{|file|
83
+ begin
84
+ @readme_md= get("#{CORE_URL}/#{@user}/#{@repo_name}/master/#{file}", json: false)
85
+ rescue
86
+ false
87
+ end
88
+ }
89
+ if !@readme_md
90
+ raise StandardError.new("No readme file found.")
91
+ else
92
+ @readme_md
93
+ end
94
+ end
95
+
96
+ end
97
+ class BitBucket
98
+ include Curldown
99
+ CORE_URL = "https://api.bitbucket.org/2.0"
100
+ attr_accessor :user, :repo_name, :commit, :tree, :readme_file, :repo_object, :readme_md
101
+ def initialize(u, r)
102
+ @user= u
103
+ @repo_name= r
104
+ end
105
+ def perform
106
+ get_repo
107
+ get_last_commit
108
+ get_tree_object
109
+ get_readme_file
110
+ get_readme_md
111
+ end
112
+ def get_repo
113
+ @repo_object= get("#{CORE_URL}/repositories/#{@user}/#{@repo_name}")
114
+ @repo_name= repo_object['name']
115
+ @repo_slug= repo_object['slug']
116
+ end
117
+ def get_last_commit
118
+ commits_url = repo_object['links']['commits']['href']
119
+ commits = get(commits_url)
120
+ @commit= commits['values'][0]['hash']
121
+ end
122
+ def get_tree_object
123
+ @tree= get("#{CORE_URL}/repositories/#{@user}/#{@repo_slug}/src/#{@commit}/")
124
+ end
125
+ def get_readme_file
126
+ tree['values'].each{|v|
127
+ if v['path'].match?(/readme.md/i)
128
+ @readme_file= v['path']
129
+ end
130
+ }
131
+ if !readme_file
132
+ raise RuntimeError.new("No readme file in repository")
133
+ end
134
+ end
135
+ def get_readme_md
136
+ @readme_md= get("https://bitbucket.org/#{@user}/#{@repo_name}/raw/#{@commit}/#{@readme_file}", json: false)
59
137
  end
60
138
  end
61
- end
139
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curldown
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Kent
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-26 00:00:00.000000000 Z
11
+ date: 2021-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: curb
@@ -16,70 +16,68 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.8'
19
+ version: '0.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.8'
26
+ version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
- name: github-markdown
28
+ name: redcarpet
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.5'
33
+ version: '3.5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.5'
40
+ version: '3.5'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.6'
47
+ version: '1.11'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.6'
54
+ version: '1.11'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pygments.rb
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.5'
61
+ version: '2.0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.5'
68
+ version: '2.0'
69
69
  description: A simple tool to parse hosted markdown files into html
70
70
  email: ian@iankent.me
71
- executables:
72
- - curldown
71
+ executables: []
73
72
  extensions: []
74
73
  extra_rdoc_files: []
75
74
  files:
76
- - bin/curldown
77
75
  - lib/curldown.rb
78
76
  homepage: https://bitbucket.org/iankentforrestbrown/curldown
79
77
  licenses:
80
78
  - MIT
81
79
  metadata: {}
82
- post_install_message:
80
+ post_install_message:
83
81
  rdoc_options: []
84
82
  require_paths:
85
83
  - lib
@@ -94,8 +92,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
92
  - !ruby/object:Gem::Version
95
93
  version: '0'
96
94
  requirements: []
97
- rubygems_version: 3.1.2
98
- signing_key:
95
+ rubygems_version: 3.1.4
96
+ signing_key:
99
97
  specification_version: 4
100
98
  summary: Curldown
101
99
  test_files: []
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'curldown'
3
- args = ARGV.dup
4
- ARGV.clear
5
- def set_options(args)
6
- @options = {}
7
- flags = [["-u","user"],["-r","repo"],["-b","branch"],["-f","file"]]
8
- if args.inspect.include?("--url=")
9
- args.each do |arg|
10
- if arg.include?("--url=")
11
- @options[:url] = arg[6..-1]
12
- end
13
- end
14
- else
15
- flags.each do |flag|
16
- if args.include?(flag[0])
17
- @options[flag[1].to_sym] = args[args.index(flag[0]) + 1]
18
- end
19
- end
20
- end
21
- end
22
- if args.inspect.include?("--copy")
23
- set_options(args)
24
- IO.popen 'pbcopy', 'w' do |io|
25
- io.print Curldown.new.get(@options)
26
- end
27
- puts "HTML has been copied to the clipboard"
28
- else
29
- set_options(args)
30
- puts Curldown.new.get(@options)
31
- end