curldown 1.0.2 → 2.0.0

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 (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