ghpreview 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -33,10 +33,14 @@ option:
33
33
  $ ghpreview -w README.md
34
34
  ```
35
35
 
36
- To use an alternate browser (Mac only), use the `-a` (or `--application`) option:
36
+ To use an alternate browser, use the `-a` (or `--application`) option:
37
37
 
38
38
  ```bash
39
+ # On Mac:
39
40
  $ ghpreview -a Safari.app README.md
41
+
42
+ #On GNU/Linux:
43
+ $ ghpreview -a konqueror README.md
40
44
  ```
41
45
 
42
46
  ## Why is this better than X?
data/lib/ghpreview.rb CHANGED
@@ -1,2 +1,2 @@
1
- require 'ghpreview/version'
2
- require 'ghpreview/previewer'
1
+ require_relative 'ghpreview/version'
2
+ require_relative 'ghpreview/previewer'
@@ -0,0 +1,23 @@
1
+ require 'html/pipeline'
2
+
3
+ module GHPreview
4
+ class Converter
5
+ def self.to_html(markdown)
6
+ context = {
7
+ asset_root: "http://assets.github.com/images/icons/",
8
+ gfm: false
9
+ }
10
+
11
+ pipeline = HTML::Pipeline.new([
12
+ HTML::Pipeline::MarkdownFilter,
13
+ HTML::Pipeline::SanitizationFilter,
14
+ HTML::Pipeline::ImageMaxWidthFilter,
15
+ HTML::Pipeline::HttpsFilter,
16
+ HTML::Pipeline::MentionFilter,
17
+ HTML::Pipeline::EmojiFilter,
18
+ HTML::Pipeline::SyntaxHighlightFilter
19
+ ], context)
20
+ result = pipeline.call(markdown)[:output].to_s
21
+ end
22
+ end
23
+ end
@@ -1,94 +1,32 @@
1
- require 'erb'
2
- require 'html/pipeline'
3
- require 'listen'
4
- require 'httpclient'
1
+ require_relative 'converter'
2
+ require_relative 'wrapper'
3
+ require_relative 'viewer'
4
+ require_relative 'watcher'
5
5
 
6
6
  module GHPreview
7
7
  class Previewer
8
- HTML_FILEPATH = '/tmp/ghpreview.html'
9
- RAW_TEMPLATE_FILEPATH = "#{File.dirname(__FILE__)}/template.erb"
10
- STYLED_TEMPLATE_FILEPATH = "/tmp/ghpreview-template.erb"
11
- HOMEPAGE = 'https://github.com'
12
- TEMPLATE_CACHE_DURATION = 60 * 60 * 24 * 7 # one week
13
8
 
14
9
  def initialize(md_filepath, options = {})
15
- @md_filepath = md_filepath
16
- @http = HTTPClient.new
17
- generate_template_with_fingerprinted_stylesheet_links
10
+ Wrapper.generate_template_with_fingerprinted_stylesheet_links
18
11
 
12
+ @md_filepath = md_filepath
19
13
  @application = options[:application]
14
+
20
15
  options[:watch] ? listen : open
21
16
  end
22
17
 
23
18
  def listen
24
19
  puts "Previewing #{@md_filepath}. CTRL-C to stop."
25
- open
26
-
27
- filename = File.basename(@md_filepath)
28
- dirname = File.dirname(File.expand_path(@md_filepath))
29
-
30
- Listen.to(dirname, filter: /#{filename}$/) do |modified|
20
+ Watcher.watch @md_filepath do
31
21
  open
32
22
  end
33
23
  end
34
24
 
35
25
  def open
36
- html = markdown_to_html
37
- html = wrap_content_with_full_document(html)
38
- File.open(HTML_FILEPATH, 'w') { |f| f << html }
39
-
40
- if RUBY_PLATFORM =~ /linux/
41
- command = 'xdg-open'
42
- else
43
- command = @application ? "open -a #{@application}" : 'open'
44
- end
45
- `#{command} #{HTML_FILEPATH}`
26
+ html = Converter.to_html(File.read(@md_filepath))
27
+ html = Wrapper.wrap_html(html)
28
+ Viewer.view_html html, @application
46
29
  end
47
30
 
48
- private
49
-
50
- def markdown_to_html
51
- markdown = File.read(@md_filepath)
52
-
53
- context = {
54
- asset_root: "http://assets.github.com/images/icons/",
55
- gfm: false
56
- }
57
-
58
- pipeline = HTML::Pipeline.new([
59
- HTML::Pipeline::MarkdownFilter,
60
- HTML::Pipeline::SanitizationFilter,
61
- HTML::Pipeline::ImageMaxWidthFilter,
62
- HTML::Pipeline::HttpsFilter,
63
- HTML::Pipeline::MentionFilter,
64
- HTML::Pipeline::EmojiFilter,
65
- HTML::Pipeline::SyntaxHighlightFilter
66
- ], context)
67
- result = pipeline.call(markdown)[:output].to_s
68
- end
69
-
70
- def generate_template_with_fingerprinted_stylesheet_links
71
- if stale_template?(STYLED_TEMPLATE_FILEPATH)
72
- stylesheet_links = @http.get(HOMEPAGE).body.split("\n").select do |line|
73
- line =~ /https:.*github.*\.css/
74
- end.join
75
-
76
- raw_template = File.read(RAW_TEMPLATE_FILEPATH)
77
- styled_template = ERB.new(raw_template).result(binding)
78
- File.open(STYLED_TEMPLATE_FILEPATH, 'w') do |f|
79
- f.write(styled_template)
80
- end
81
- end
82
- end
83
-
84
- def stale_template?(filepath)
85
- return true unless File.exists?(filepath)
86
- File.mtime(filepath) < (Time.now - TEMPLATE_CACHE_DURATION)
87
- end
88
-
89
- def wrap_content_with_full_document(content)
90
- template = File.read(STYLED_TEMPLATE_FILEPATH)
91
- ERB.new(template).result(binding)
92
- end
93
31
  end
94
32
  end
@@ -1,5 +1,7 @@
1
+ <!DOCTYPE html>
1
2
  <html>
2
3
  <head>
4
+ <meta charset='utf-8'>
3
5
  <%= stylesheet_links %>
4
6
  <style>
5
7
  body { padding: 30px 0; }
@@ -1,3 +1,3 @@
1
1
  module GHPreview
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -0,0 +1,24 @@
1
+ module GHPreview
2
+ class Viewer
3
+ HTML_FILEPATH = '/tmp/ghpreview.html'
4
+
5
+ def self.view_html(html, application = nil)
6
+ File.open(HTML_FILEPATH, 'w') { |f| f << html }
7
+
8
+ if RUBY_PLATFORM =~ /linux/
9
+ command = if application
10
+ `#{application} #{HTML_FILEPATH} </dev/null &>/dev/null &`
11
+ else
12
+ `xdg-open #{HTML_FILEPATH}`
13
+ end
14
+ else
15
+ command = if application
16
+ "open -a #{application}"
17
+ else
18
+ 'open'
19
+ end
20
+ `#{command} #{HTML_FILEPATH}`
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ require 'listen'
2
+
3
+ module GHPreview
4
+ class Watcher
5
+ def self.watch(filepath)
6
+ yield
7
+
8
+ filename = File.basename(filepath)
9
+ dirname = File.dirname(File.expand_path(filepath))
10
+
11
+ Listen.to(dirname, filter: /#{filename}$/) do |modified|
12
+ yield
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ require 'erb'
2
+ require 'httpclient'
3
+
4
+ module GHPreview
5
+ class Wrapper
6
+ GITHUB_URL = 'https://github.com'
7
+ STYLED_TEMPLATE_FILEPATH = "/tmp/ghpreview-template.erb"
8
+ TEMPLATE_CACHE_DURATION = 60 * 60 * 24 * 7 # one week
9
+ RAW_TEMPLATE_FILEPATH = "#{File.dirname(__FILE__)}/template.erb"
10
+
11
+ def self.generate_template_with_fingerprinted_stylesheet_links
12
+ http = HTTPClient.new
13
+
14
+ if stale_template?(STYLED_TEMPLATE_FILEPATH)
15
+ stylesheet_links = http.get(GITHUB_URL).body.split("\n").select do |line|
16
+ line =~ /https:.*github.*\.css/
17
+ end.join
18
+
19
+ raw_template = File.read(RAW_TEMPLATE_FILEPATH)
20
+ styled_template = ERB.new(raw_template).result(binding)
21
+ File.open(STYLED_TEMPLATE_FILEPATH, 'w') do |f|
22
+ f.write(styled_template)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.wrap_html(content)
28
+ template = File.read(STYLED_TEMPLATE_FILEPATH)
29
+ ERB.new(template).result(binding)
30
+ end
31
+
32
+ private
33
+
34
+ def self.stale_template?(filepath)
35
+ return true unless File.exists?(filepath)
36
+ File.mtime(filepath) < (Time.now - TEMPLATE_CACHE_DURATION)
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative '../lib/ghpreview/converter'
4
+
5
+ describe GHPreview::Converter do
6
+ let(:converter) { GHPreview::Converter }
7
+
8
+ it "converts markdown to HTML" do
9
+ expect(converter.to_html('# Foo')).to eql('<h1>Foo</h1>')
10
+ end
11
+
12
+ it "passes through non-ASCII characters" do
13
+ expect(converter.to_html('# Baña')).to eql('<h1>Baña</h1>')
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './lib/ghpreview'
4
+
5
+ GHPreview::Previewer.new('README.md')
data/spec/watch_readme ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require './lib/ghpreview'
4
+
5
+ GHPreview::Previewer.new('README.md', watch: true)
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative '../lib/ghpreview/wrapper'
4
+
5
+ describe GHPreview::Wrapper do
6
+ let(:wrapper) { GHPreview::Wrapper }
7
+
8
+ it "wraps an HTML fragment in a full document" do
9
+ fragment = '<h1>foo</h1>'
10
+ expect(wrapper.wrap_html(fragment)).to include('<html>')
11
+ end
12
+
13
+ it "passes through non-ASCII chars" do
14
+ expect(wrapper.wrap_html('<h1>Baña</h1>')).to include('Baña')
15
+ end
16
+
17
+ it "specifies the charset" do
18
+ expect(wrapper.wrap_html('# foo')).to include("charset='utf-8'")
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghpreview
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-04 00:00:00.000000000 Z
12
+ date: 2013-06-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: listen
@@ -107,9 +107,17 @@ files:
107
107
  - bin/ghpreview
108
108
  - ghpreview.gemspec
109
109
  - lib/ghpreview.rb
110
+ - lib/ghpreview/converter.rb
110
111
  - lib/ghpreview/previewer.rb
111
112
  - lib/ghpreview/template.erb
112
113
  - lib/ghpreview/version.rb
114
+ - lib/ghpreview/viewer.rb
115
+ - lib/ghpreview/watcher.rb
116
+ - lib/ghpreview/wrapper.rb
117
+ - spec/converter_spec.rb
118
+ - spec/preview_readme
119
+ - spec/watch_readme
120
+ - spec/wrapper_spec.rb
113
121
  homepage: http://github.com/newcontext/ghpreview
114
122
  licenses: []
115
123
  post_install_message:
@@ -134,5 +142,9 @@ rubygems_version: 1.8.23
134
142
  signing_key:
135
143
  specification_version: 3
136
144
  summary: Command line utility for previewing Markdown files with Github styling
137
- test_files: []
145
+ test_files:
146
+ - spec/converter_spec.rb
147
+ - spec/preview_readme
148
+ - spec/watch_readme
149
+ - spec/wrapper_spec.rb
138
150
  has_rdoc: