curldown 0.2.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/curldown.rb +124 -44
  3. metadata +28 -39
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5ea9b6021f6c175cfcc850480ff92f96980dc1286c745ef25fe9a5a011670abb
4
+ data.tar.gz: f9e98da7a5337a801288dcafdcb5286d19673cf3777a464605130f5740a78354
5
+ SHA512:
6
+ metadata.gz: 5e3534e2a6ef8e7e35943ae47130b8863ba05289500e0bdd9a76dfbfd67e2ea8efbe67907a66f89bd7d280680fd947a4f074efc024c8ba489a15eec97eaa00d8
7
+ data.tar.gz: 43a93ba4c4f92c96b9d23111649bd2f53f78e165ca9a27e260ad8bf3bb2f48a7bebf80184bbac480a26525da1d94a6c945671d119e271fcb3ceb66249aeca161
data/lib/curldown.rb CHANGED
@@ -1,43 +1,59 @@
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, :lexers
29
+ def initialize(user: false, repo: false, url: false, github: false, bitbucket: false)
30
+ @lexers = []
31
+ Pygments.lexers.each{|k,v| @lexers << v[:aliases] }
32
+ @lexers.flatten!
33
+ if url
34
+ @raw = get(url, json: false)
35
+ else
36
+ if github
37
+ req = GitHub.new(user, repo)
38
+ elsif bitbucket
39
+ req = BitBucket.new(user, repo)
40
+ else
41
+ raise StandardError.new("Must specify either: github, bitbucket or url parameters.")
42
+ end
43
+ req.perform
44
+ @raw= req.readme_md
45
+ end
46
+ end
47
+ def render
48
+ md = Redcarpet::Markdown.new(Redcarpet::Render::HTML, fenced_code_blocks: true)
49
+ @html= md.render(@raw)
50
+ end
51
+ def highlight!
52
+ doc = Nokogiri::HTML(@html)
38
53
  doc.css("pre").each do |pre|
39
- if @@lexers.include?(pre.attributes["lang"].value)
40
- lang = pre.attributes["lang"].value
54
+ attrs = pre.children[0].attributes['class']
55
+ if attrs
56
+ lang = validate_lexer(attrs.value)
41
57
  else
42
58
  lang = "sh"
43
59
  end
@@ -46,16 +62,80 @@ class Curldown
46
62
  pre.add_next_sibling(parsed)
47
63
  pre.remove
48
64
  end
49
- doc.css("body").children.to_html
50
- else
51
- raise "#{url} is responding with a 404 error"
65
+ @html = doc.css("body").children.to_html
66
+ end
67
+ def validate_lexer(string)
68
+ @lexers.include?(string) ? string : "sh"
52
69
  end
70
+
53
71
  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]}"
72
+ class GitHub
73
+ include Curldown
74
+ CORE_URL = "https://raw.githubusercontent.com"
75
+ attr_accessor :user, :repo_name, :readme_md
76
+ def initialize(u, r)
77
+ @user= u
78
+ @repo_name= r
79
+ end
80
+ def perform
81
+ get_readme
82
+ end
83
+ def get_readme
84
+ ["readme.md", "README.md", "README.MD", "Readme.md"].each{|file|
85
+ begin
86
+ @readme_md= get("#{CORE_URL}/#{@user}/#{@repo_name}/master/#{file}", json: false)
87
+ rescue
88
+ false
89
+ end
90
+ }
91
+ if !@readme_md
92
+ raise StandardError.new("No readme file found.")
93
+ else
94
+ @readme_md
95
+ end
96
+ end
97
+
98
+ end
99
+ class BitBucket
100
+ include Curldown
101
+ CORE_URL = "https://api.bitbucket.org/2.0"
102
+ attr_accessor :user, :repo_name, :commit, :tree, :readme_file, :repo_object, :readme_md
103
+ def initialize(u, r)
104
+ @user= u
105
+ @repo_name= r
106
+ end
107
+ def perform
108
+ get_repo
109
+ get_last_commit
110
+ get_tree_object
111
+ get_readme_file
112
+ get_readme_md
113
+ end
114
+ def get_repo
115
+ @repo_object= get("#{CORE_URL}/repositories/#{@user}/#{@repo_name}")
116
+ @repo_name= repo_object['name']
117
+ @repo_slug= repo_object['slug']
118
+ end
119
+ def get_last_commit
120
+ commits_url = repo_object['links']['commits']['href']
121
+ commits = get(commits_url)
122
+ @commit= commits['values'][0]['hash']
123
+ end
124
+ def get_tree_object
125
+ @tree= get("#{CORE_URL}/repositories/#{@user}/#{@repo_slug}/src/#{@commit}/")
126
+ end
127
+ def get_readme_file
128
+ tree['values'].each{|v|
129
+ if v['path'].match?(/readme.md/i)
130
+ @readme_file= v['path']
131
+ end
132
+ }
133
+ if !readme_file
134
+ raise RuntimeError.new("No readme file in repository")
135
+ end
136
+ end
137
+ def get_readme_md
138
+ @readme_md= get("https://bitbucket.org/#{@user}/#{@repo_name}/raw/#{@commit}/#{@readme_file}", json: false)
59
139
  end
60
140
  end
61
- end
141
+ end
metadata CHANGED
@@ -1,80 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curldown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
5
- prerelease:
4
+ version: 2.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ian Kent
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-07 00:00:00.000000000 Z
11
+ date: 2021-03-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: curb
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 0.8.4
19
+ version: '0.9'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 0.8.4
26
+ version: '0.9'
30
27
  - !ruby/object:Gem::Dependency
31
- name: github-markdown
28
+ name: redcarpet
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: 0.5.3
33
+ version: '3.5'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: 0.5.3
40
+ version: '3.5'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: nokogiri
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 1.6.0
47
+ version: '1.11'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 1.6.0
54
+ version: '1.11'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: pygments.rb
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: 0.5.1
61
+ version: '2.0'
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: 0.5.1
68
+ version: '2.0'
78
69
  description: A simple tool to parse hosted markdown files into html
79
70
  email: ian@iankent.me
80
71
  executables: []
@@ -82,29 +73,27 @@ extensions: []
82
73
  extra_rdoc_files: []
83
74
  files:
84
75
  - lib/curldown.rb
85
- homepage: http://code.iankent.me/curldown
76
+ homepage: https://bitbucket.org/iankentforrestbrown/curldown
86
77
  licenses:
87
78
  - MIT
88
- post_install_message:
79
+ metadata: {}
80
+ post_install_message:
89
81
  rdoc_options: []
90
82
  require_paths:
91
83
  - lib
92
84
  required_ruby_version: !ruby/object:Gem::Requirement
93
- none: false
94
85
  requirements:
95
- - - ! '>='
86
+ - - ">="
96
87
  - !ruby/object:Gem::Version
97
88
  version: '0'
98
89
  required_rubygems_version: !ruby/object:Gem::Requirement
99
- none: false
100
90
  requirements:
101
- - - ! '>='
91
+ - - ">="
102
92
  - !ruby/object:Gem::Version
103
93
  version: '0'
104
94
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 1.8.25
107
- signing_key:
108
- specification_version: 3
95
+ rubygems_version: 3.1.4
96
+ signing_key:
97
+ specification_version: 4
109
98
  summary: Curldown
110
99
  test_files: []