gh-preview 1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cfa2b455d2ca4bb7a09b18e6ec44abf69d000750
4
+ data.tar.gz: 6bde0e4328449d704b0a0b70bc461b409aa3bd7f
5
+ SHA512:
6
+ metadata.gz: 4c9a82c9156ee1b62989693b23938a4968b7e61d2d04831219cd122b57e7a783a6582ebbf8a6a4f1d223bc01429d36ecc929bd5854b9cf0a4cf2b08114a709cd
7
+ data.tar.gz: cc387fdf810a89bab28e19dd995ccce22a1580886938072a83c698b7824c70524891623f86836e0cc34a1ffc3f57302f25de3e17a1aaf390d269a9470d4bbf0e
@@ -0,0 +1,3 @@
1
+ /*.gem
2
+ /*.lock
3
+ /coverage
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 2.2.0
5
+ - 2.1.0
6
+ - 2.0.0
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Nicolas Rodriguez <nrodriguez@jbox-web.com>
@@ -0,0 +1,5 @@
1
+ ## CHANGELOG
2
+
3
+ ### 1.0.0 - 2015-09-17
4
+
5
+ First release!
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sitgen.gemspec
4
+ gemspec
5
+
6
+ gem 'codeclimate-test-reporter', group: :test, require: nil
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ The MIT License (MIT)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ ## GitHubPreview
2
+
3
+ [![GitHub license](https://img.shields.io/github/license/jbox-web/gh-preview.svg)](https://github.com/jbox-web/gh-preview/blob/master/LICENSE)
4
+ [![GitHub release](https://img.shields.io/github/release/jbox-web/gh-preview.svg)](https://github.com/jbox-web/gh-preview/releases/latest)
5
+ [![Build Status](https://travis-ci.org/jbox-web/gh-preview.svg?branch=master)](https://travis-ci.org/jbox-web/gh-preview)
6
+ [![Code Climate](https://codeclimate.com/github/jbox-web/gh-preview/badges/gpa.svg)](https://codeclimate.com/github/jbox-web/gh-preview)
7
+ [![Test Coverage](https://codeclimate.com/github/jbox-web/gh-preview/badges/coverage.svg)](https://codeclimate.com/github/jbox-web/gh-preview/coverage)
8
+ [![Dependency Status](https://gemnasium.com/jbox-web/gh-preview.svg)](https://gemnasium.com/jbox-web/gh-preview)
9
+
10
+ ### A small Sinatra application to preview GitHub README files, easy ;)
11
+
12
+ This gem provides a small Sinatra application to preview GitHub README files or any markdown file.
13
+
14
+ **Notes** : The app can only serve one file at a time. If you need a more sophisticated rendering system, look at [Jekyll](https://github.com/jekyll/jekyll) ;)
15
+
16
+ ## Installation
17
+
18
+ ```ruby
19
+ gem install gh-preview
20
+ ```
21
+
22
+ No need to add it to your Gemfile, it will be globally available.
23
+
24
+ ## Usage
25
+
26
+ From any directory containing a ```README.md``` file :
27
+
28
+ ```sh
29
+ nicolas@desktop:~/my/wonderful/application$ gh-preview server
30
+ ```
31
+
32
+ Then open your browser at this url : [http://localhost:4000](http://localhost:4000).
33
+
34
+ ## Options
35
+
36
+ ```sh
37
+ Usage:
38
+ gh-preview server [options]
39
+
40
+ Options:
41
+ -f, [--file=FILE] # File to serve (default: README.md)
42
+ -p, [--port=PORT] # Port for server (default 4000)
43
+ ```
44
+
45
+ ## Contributors
46
+
47
+ A big thank to [them](https://github.com/jbox-web/gh-preview/blob/master/AUTHORS) for their contribution!
48
+
49
+ ## Contribute
50
+
51
+ You can contribute to this plugin in many ways such as :
52
+
53
+ * Helping with documentation
54
+ * Contributing code (features or bugfixes)
55
+ * Reporting a bug
56
+ * Submitting translations
@@ -0,0 +1,15 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+ require 'rspec/core/rake_task'
6
+
7
+ desc 'Start unit tests'
8
+ task test: :default
9
+
10
+ task :default do
11
+ RSpec::Core::RakeTask.new(:spec) do |config|
12
+ config.rspec_opts = '--color'
13
+ end
14
+ Rake::Task['spec'].invoke
15
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gh_preview'
4
+
5
+ GhPreview::Runner.start(ARGV)
@@ -0,0 +1,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'gh_preview/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'gh-preview'
7
+ s.version = GhPreview::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Nicolas Rodriguez']
10
+ s.email = ['nrodriguez@jbox-web.com']
11
+ s.homepage = 'http://jbox-web.github.io/gh-preview/'
12
+ s.description = %q{A small gem to preview GitHub README files}
13
+ s.summary = %q{This gem provides a small Sinatra application to preview GitHub README files}
14
+ s.license = 'MIT'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ['lib']
20
+
21
+ s.add_runtime_dependency 'rake', '~> 10.4', '>= 10.4.2'
22
+ s.add_runtime_dependency 'rack', '~> 1.6', '>= 1.6.4'
23
+ s.add_runtime_dependency 'thor', '~> 0.19', '>= 0.19.1'
24
+ s.add_runtime_dependency 'haml', '~> 4.0', '>= 4.0.7'
25
+ s.add_runtime_dependency 'json', '~> 1.8', '>= 1.8.3'
26
+ s.add_runtime_dependency 'mime-types', '~> 2.6', '>= 2.6.2'
27
+
28
+ s.add_runtime_dependency 'sinatra', '~> 1.4', '>= 1.4.6'
29
+ s.add_runtime_dependency 'sinatra-contrib', '~> 1.4', '>= 1.4.6'
30
+ s.add_runtime_dependency 'sinatra-flash', '~> 0.3', '>= 0.3.0'
31
+
32
+ s.add_runtime_dependency 'html-pipeline', '~> 2.0', '>= 2.0.0'
33
+ s.add_runtime_dependency 'redcarpet', '~> 3.3', '>= 3.3.2'
34
+ s.add_runtime_dependency 'pygments.rb', '~> 0.6', '>= 0.6.3'
35
+ s.add_runtime_dependency 'task_list', '~> 1.0', '>= 1.0.2'
36
+ s.add_runtime_dependency 'rinku', '~> 1.7', '>= 1.7.3'
37
+
38
+ s.add_development_dependency 'rspec', '~> 3.3', '>= 3.3.0'
39
+ s.add_development_dependency 'capybara', '~> 2.5', '>= 2.5.0'
40
+ s.add_development_dependency 'simplecov', '~> 0.10', '>= 0.10.0'
41
+ s.add_development_dependency 'zeus', '~> 0.15', '>= 0.15.4'
42
+ s.add_development_dependency 'rack-test', '~> 0.6', '>= 0.6.3'
43
+ end
@@ -0,0 +1,7 @@
1
+ module GhPreview
2
+ require 'gh_preview/config'
3
+ require 'gh_preview/converter'
4
+ require 'gh_preview/redcarpet_filter'
5
+ require 'gh_preview/runner'
6
+ require 'gh_preview/server'
7
+ end
@@ -0,0 +1,27 @@
1
+ module GhPreview
2
+ module Config
3
+ extend self
4
+
5
+ NAME = 'GitHub Preview'
6
+ GITHUB_URL = 'https://github.com/jbox-web/gh-preview'
7
+
8
+
9
+ def views_folder
10
+ File.join(gem_path, 'views')
11
+ end
12
+
13
+
14
+ def public_folder
15
+ File.join(gem_path, 'public')
16
+ end
17
+
18
+
19
+ private
20
+
21
+
22
+ def gem_path
23
+ Gem::Specification.find_by_name('gh-preview').gem_dir
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ require 'html/pipeline'
2
+ require 'task_list/filter'
3
+
4
+ module GhPreview
5
+ module Converter
6
+ extend self
7
+
8
+ def to_html(markdown)
9
+ pipeline.call(markdown)[:output].to_s
10
+ end
11
+
12
+
13
+ private
14
+
15
+
16
+ def pipeline
17
+ HTML::Pipeline.new(filters)
18
+ end
19
+
20
+
21
+ def filters
22
+ [
23
+ GhPreview::RedcarpetFilter,
24
+ TaskList::Filter,
25
+ HTML::Pipeline::AutolinkFilter,
26
+ HTML::Pipeline::TableOfContentsFilter
27
+ ]
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,49 @@
1
+ require 'html/pipeline/filter'
2
+ require 'html/pipeline/text_filter'
3
+ require 'pygments'
4
+ require 'redcarpet'
5
+
6
+ module GhPreview
7
+
8
+ class HTMLwithPygments < Redcarpet::Render::HTML
9
+
10
+ def block_code(code, language)
11
+ Pygments.highlight(code, lexer: language)
12
+ end
13
+
14
+ end
15
+
16
+
17
+ class RedcarpetFilter < HTML::Pipeline::TextFilter
18
+
19
+ def initialize(text, context = nil, result = nil)
20
+ super text, context, result
21
+ @text = @text.gsub "\r", ''
22
+ end
23
+
24
+
25
+ # Convert Markdown to HTML using the best available implementation
26
+ # and convert into a DocumentFragment.
27
+ #
28
+ def call
29
+ Redcarpet::Markdown.new(HTMLwithPygments, mk_options).render(@text)
30
+ end
31
+
32
+
33
+ private
34
+
35
+
36
+ def mk_options
37
+ {
38
+ strikethrough: true,
39
+ autolink: true,
40
+ tables: true,
41
+ underline: true,
42
+ highlight: true,
43
+ lax_spacing: true,
44
+ fenced_code_blocks: true
45
+ }
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ require 'rack'
2
+ require 'thor'
3
+
4
+ module GhPreview
5
+ class Runner < Thor
6
+
7
+ desc 'server [options]', 'runs server mode'
8
+ method_option :file, aliases: '-f', desc: 'File to serve (default: README.md)'
9
+ method_option :port, aliases: '-p', desc: 'Port for server (default 4000)'
10
+
11
+ def server
12
+ app = Rack::Builder.new
13
+ app.run GhPreview::Server.new(options[:file] || 'README.md')
14
+ Rack::Server.start app: app, Port: (options[:port] || 4000), server: 'webrick'
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,64 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/reloader'
3
+ require 'sinatra/flash'
4
+ require 'sinatra/flash/style_patch'
5
+ require 'tilt/haml'
6
+
7
+ module GhPreview
8
+ class Server < Sinatra::Base
9
+
10
+ enable :sessions
11
+ register Sinatra::Flash
12
+
13
+ configure :development do
14
+ register Sinatra::Reloader
15
+ end
16
+
17
+ set :views, GhPreview::Config.views_folder
18
+ set :public_folder, GhPreview::Config.public_folder
19
+ set :haml, attr_wrapper: '"'
20
+
21
+ helpers do
22
+
23
+ def render(*args)
24
+ if args.first.is_a?(Hash) && args.first.keys.include?(:partial)
25
+ return haml "_#{args.first[:partial]}".to_sym, layout: false
26
+ else
27
+ super
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+
34
+ def initialize(file)
35
+ super
36
+ @file = file
37
+ end
38
+
39
+
40
+ get '/' do
41
+ if file_content(@file)
42
+ @text = render_file(file_content(@file))
43
+ else
44
+ flash.now[:warning] = "#{@file} doesn't exist !"
45
+ end
46
+ haml :index
47
+ end
48
+
49
+
50
+ private
51
+
52
+
53
+ def render_file(file)
54
+ GhPreview::Converter.to_html(file)
55
+ end
56
+
57
+
58
+ def file_content(file)
59
+ return nil unless File.exist?(file)
60
+ File.read(file)
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module GhPreview
2
+ VERSION = '1.0.0'
3
+ end
@@ -0,0 +1,32 @@
1
+ module Sinatra
2
+ module Flash
3
+ module Style
4
+
5
+ # A view helper for rendering flash messages to HTML with reasonable CSS structure. Handles
6
+ # multiple flash messages in one request. Wraps them in a <div> tag with id #flash containing
7
+ # a <div> for each message with classes of .flash and the message type. E.g.:
8
+ #
9
+ # @example
10
+ # <div id='flash'>
11
+ # <div class='flash info'>Today is Tuesday, April 27th.</div>
12
+ # <div class='flash warning'>Missiles are headed to destroy the Earth!</div>
13
+ # </div>
14
+ #
15
+ # It is your responsibility to style these classes the way you want in your stylesheets.
16
+ #
17
+ # @param[optional, String, Symbol] key Specifies which flash collection you want to display.
18
+ # If you use this, the collection key will be appended to the top-level div id (e.g.,
19
+ # 'flash_login' if you pass a key of :login).
20
+ #
21
+ # @return [String] Styled HTML if the flash contains messages, or an empty string if it's empty.
22
+ #
23
+ def styled_flash(key=:flash)
24
+ return '' if flash(key).empty?
25
+ id = (key == :flash ? 'flash' : "flash_#{key}")
26
+ messages = flash(key).collect { |message| " <div class='alert alert-#{message[0]}'>#{message[1]}</div>\n" }
27
+ "<div id='#{id}'>\n" + messages.join + '</div>'
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ body {
2
+ padding-top: 20px;
3
+ padding-bottom: 20px;
4
+ }
5
+
6
+ .navbar {
7
+ margin-bottom: 30px;
8
+ }
9
+
10
+ .ribbons {
11
+ position: absolute;
12
+ top: 0pt;
13
+ right: 0pt;
14
+ border: 0pt none;
15
+ }
@@ -0,0 +1,652 @@
1
+ @font-face {
2
+ font-family: octicons-anchor;
3
+ src: url(data:font/woff;charset=utf-8;base64,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) format('woff');
4
+ }
5
+
6
+ .markdown-body {
7
+ -webkit-text-size-adjust: 100%;
8
+ text-size-adjust: 100%;
9
+ color: #333;
10
+ overflow: hidden;
11
+ font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
12
+ font-size: 16px;
13
+ line-height: 1.6;
14
+ word-wrap: break-word;
15
+ }
16
+
17
+ .markdown-body a {
18
+ background-color: transparent;
19
+ }
20
+
21
+ .markdown-body a:active,
22
+ .markdown-body a:hover {
23
+ outline: 0;
24
+ }
25
+
26
+ .markdown-body strong {
27
+ font-weight: bold;
28
+ }
29
+
30
+ .markdown-body h1 {
31
+ font-size: 2em;
32
+ margin: 0.67em 0;
33
+ }
34
+
35
+ .markdown-body img {
36
+ border: 0;
37
+ }
38
+
39
+ .markdown-body hr {
40
+ box-sizing: content-box;
41
+ height: 0;
42
+ }
43
+
44
+ .markdown-body pre {
45
+ overflow: auto;
46
+ }
47
+
48
+ .markdown-body code,
49
+ .markdown-body kbd,
50
+ .markdown-body pre {
51
+ font-family: monospace, monospace;
52
+ font-size: 1em;
53
+ }
54
+
55
+ .markdown-body input {
56
+ color: inherit;
57
+ font: inherit;
58
+ margin: 0;
59
+ }
60
+
61
+ .markdown-body html input[disabled] {
62
+ cursor: default;
63
+ }
64
+
65
+ .markdown-body input {
66
+ line-height: normal;
67
+ }
68
+
69
+ .markdown-body input[type="checkbox"] {
70
+ box-sizing: border-box;
71
+ padding: 0;
72
+ }
73
+
74
+ .markdown-body table {
75
+ border-collapse: collapse;
76
+ border-spacing: 0;
77
+ }
78
+
79
+ .markdown-body td,
80
+ .markdown-body th {
81
+ padding: 0;
82
+ }
83
+
84
+ .markdown-body * {
85
+ box-sizing: border-box;
86
+ }
87
+
88
+ .markdown-body input {
89
+ font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol";
90
+ }
91
+
92
+ .markdown-body a {
93
+ color: #4078c0;
94
+ text-decoration: none;
95
+ }
96
+
97
+ .markdown-body a:hover,
98
+ .markdown-body a:active {
99
+ text-decoration: underline;
100
+ }
101
+
102
+ .markdown-body hr {
103
+ height: 0;
104
+ margin: 15px 0;
105
+ overflow: hidden;
106
+ background: transparent;
107
+ border: 0;
108
+ border-bottom: 1px solid #ddd;
109
+ }
110
+
111
+ .markdown-body hr:before {
112
+ display: table;
113
+ content: "";
114
+ }
115
+
116
+ .markdown-body hr:after {
117
+ display: table;
118
+ clear: both;
119
+ content: "";
120
+ }
121
+
122
+ .markdown-body h1,
123
+ .markdown-body h2,
124
+ .markdown-body h3,
125
+ .markdown-body h4,
126
+ .markdown-body h5,
127
+ .markdown-body h6 {
128
+ margin-top: 15px;
129
+ margin-bottom: 15px;
130
+ line-height: 1.1;
131
+ }
132
+
133
+ .markdown-body h1 {
134
+ font-size: 30px;
135
+ }
136
+
137
+ .markdown-body h2 {
138
+ font-size: 21px;
139
+ }
140
+
141
+ .markdown-body h3 {
142
+ font-size: 16px;
143
+ }
144
+
145
+ .markdown-body h4 {
146
+ font-size: 14px;
147
+ }
148
+
149
+ .markdown-body h5 {
150
+ font-size: 12px;
151
+ }
152
+
153
+ .markdown-body h6 {
154
+ font-size: 11px;
155
+ }
156
+
157
+ .markdown-body blockquote {
158
+ margin: 0;
159
+ }
160
+
161
+ .markdown-body ul,
162
+ .markdown-body ol {
163
+ padding: 0;
164
+ margin-top: 0;
165
+ margin-bottom: 0;
166
+ }
167
+
168
+ .markdown-body ol ol,
169
+ .markdown-body ul ol {
170
+ list-style-type: lower-roman;
171
+ }
172
+
173
+ .markdown-body ul ul ol,
174
+ .markdown-body ul ol ol,
175
+ .markdown-body ol ul ol,
176
+ .markdown-body ol ol ol {
177
+ list-style-type: lower-alpha;
178
+ }
179
+
180
+ .markdown-body dd {
181
+ margin-left: 0;
182
+ }
183
+
184
+ .markdown-body code {
185
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
186
+ font-size: 12px;
187
+ }
188
+
189
+ .markdown-body pre {
190
+ margin-top: 0;
191
+ margin-bottom: 0;
192
+ font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace;
193
+ }
194
+
195
+ .markdown-body .select::-ms-expand {
196
+ opacity: 0;
197
+ }
198
+
199
+ .markdown-body .octicon {
200
+ font: normal normal normal 16px/1 octicons-anchor;
201
+ display: inline-block;
202
+ text-decoration: none;
203
+ text-rendering: auto;
204
+ -webkit-font-smoothing: antialiased;
205
+ -moz-osx-font-smoothing: grayscale;
206
+ -webkit-user-select: none;
207
+ -moz-user-select: none;
208
+ -ms-user-select: none;
209
+ user-select: none;
210
+ }
211
+
212
+ .markdown-body .octicon-link:before {
213
+ content: '\f05c';
214
+ }
215
+
216
+ .markdown-body>*:first-child {
217
+ margin-top: 0 !important;
218
+ }
219
+
220
+ .markdown-body>*:last-child {
221
+ margin-bottom: 0 !important;
222
+ }
223
+
224
+ .markdown-body a:not([href]) {
225
+ color: inherit;
226
+ text-decoration: none;
227
+ }
228
+
229
+ .markdown-body .anchor {
230
+ position: absolute;
231
+ top: 0;
232
+ left: 0;
233
+ display: block;
234
+ padding-right: 6px;
235
+ padding-left: 30px;
236
+ margin-left: -30px;
237
+ }
238
+
239
+ .markdown-body .anchor:focus {
240
+ outline: none;
241
+ }
242
+
243
+ .markdown-body h1,
244
+ .markdown-body h2,
245
+ .markdown-body h3,
246
+ .markdown-body h4,
247
+ .markdown-body h5,
248
+ .markdown-body h6 {
249
+ position: relative;
250
+ margin-top: 1em;
251
+ margin-bottom: 16px;
252
+ font-weight: bold;
253
+ line-height: 1.4;
254
+ }
255
+
256
+ .markdown-body h1 .octicon-link,
257
+ .markdown-body h2 .octicon-link,
258
+ .markdown-body h3 .octicon-link,
259
+ .markdown-body h4 .octicon-link,
260
+ .markdown-body h5 .octicon-link,
261
+ .markdown-body h6 .octicon-link {
262
+ display: none;
263
+ color: #000;
264
+ vertical-align: middle;
265
+ }
266
+
267
+ .markdown-body h1:hover .anchor,
268
+ .markdown-body h2:hover .anchor,
269
+ .markdown-body h3:hover .anchor,
270
+ .markdown-body h4:hover .anchor,
271
+ .markdown-body h5:hover .anchor,
272
+ .markdown-body h6:hover .anchor {
273
+ padding-left: 8px;
274
+ margin-left: -30px;
275
+ text-decoration: none;
276
+ }
277
+
278
+ .markdown-body h1:hover .anchor .octicon-link,
279
+ .markdown-body h2:hover .anchor .octicon-link,
280
+ .markdown-body h3:hover .anchor .octicon-link,
281
+ .markdown-body h4:hover .anchor .octicon-link,
282
+ .markdown-body h5:hover .anchor .octicon-link,
283
+ .markdown-body h6:hover .anchor .octicon-link {
284
+ display: inline-block;
285
+ }
286
+
287
+ .markdown-body h1 {
288
+ padding-bottom: 0.3em;
289
+ font-size: 2.25em;
290
+ line-height: 1.2;
291
+ border-bottom: 1px solid #eee;
292
+ }
293
+
294
+ .markdown-body h1 .anchor {
295
+ line-height: 1;
296
+ }
297
+
298
+ .markdown-body h2 {
299
+ padding-bottom: 0.3em;
300
+ font-size: 1.75em;
301
+ line-height: 1.225;
302
+ border-bottom: 1px solid #eee;
303
+ }
304
+
305
+ .markdown-body h2 .anchor {
306
+ line-height: 1;
307
+ }
308
+
309
+ .markdown-body h3 {
310
+ font-size: 1.5em;
311
+ line-height: 1.43;
312
+ }
313
+
314
+ .markdown-body h3 .anchor {
315
+ line-height: 1.2;
316
+ }
317
+
318
+ .markdown-body h4 {
319
+ font-size: 1.25em;
320
+ }
321
+
322
+ .markdown-body h4 .anchor {
323
+ line-height: 1.2;
324
+ }
325
+
326
+ .markdown-body h5 {
327
+ font-size: 1em;
328
+ }
329
+
330
+ .markdown-body h5 .anchor {
331
+ line-height: 1.1;
332
+ }
333
+
334
+ .markdown-body h6 {
335
+ font-size: 1em;
336
+ color: #777;
337
+ }
338
+
339
+ .markdown-body h6 .anchor {
340
+ line-height: 1.1;
341
+ }
342
+
343
+ .markdown-body p,
344
+ .markdown-body blockquote,
345
+ .markdown-body ul,
346
+ .markdown-body ol,
347
+ .markdown-body dl,
348
+ .markdown-body table,
349
+ .markdown-body pre {
350
+ margin-top: 0;
351
+ margin-bottom: 16px;
352
+ }
353
+
354
+ .markdown-body hr {
355
+ height: 4px;
356
+ padding: 0;
357
+ margin: 16px 0;
358
+ background-color: #e7e7e7;
359
+ border: 0 none;
360
+ }
361
+
362
+ .markdown-body ul,
363
+ .markdown-body ol {
364
+ padding-left: 2em;
365
+ }
366
+
367
+ .markdown-body ul ul,
368
+ .markdown-body ul ol,
369
+ .markdown-body ol ol,
370
+ .markdown-body ol ul {
371
+ margin-top: 0;
372
+ margin-bottom: 0;
373
+ }
374
+
375
+ .markdown-body li>p {
376
+ margin-top: 16px;
377
+ }
378
+
379
+ .markdown-body dl {
380
+ padding: 0;
381
+ }
382
+
383
+ .markdown-body dl dt {
384
+ padding: 0;
385
+ margin-top: 16px;
386
+ font-size: 1em;
387
+ font-style: italic;
388
+ font-weight: bold;
389
+ }
390
+
391
+ .markdown-body dl dd {
392
+ padding: 0 16px;
393
+ margin-bottom: 16px;
394
+ }
395
+
396
+ .markdown-body blockquote {
397
+ padding: 0 15px;
398
+ color: #777;
399
+ border-left: 4px solid #ddd;
400
+ }
401
+
402
+ .markdown-body blockquote>:first-child {
403
+ margin-top: 0;
404
+ }
405
+
406
+ .markdown-body blockquote>:last-child {
407
+ margin-bottom: 0;
408
+ }
409
+
410
+ .markdown-body table {
411
+ display: block;
412
+ width: 100%;
413
+ overflow: auto;
414
+ word-break: normal;
415
+ word-break: keep-all;
416
+ }
417
+
418
+ .markdown-body table th {
419
+ font-weight: bold;
420
+ }
421
+
422
+ .markdown-body table th,
423
+ .markdown-body table td {
424
+ padding: 6px 13px;
425
+ border: 1px solid #ddd;
426
+ }
427
+
428
+ .markdown-body table tr {
429
+ background-color: #fff;
430
+ border-top: 1px solid #ccc;
431
+ }
432
+
433
+ .markdown-body table tr:nth-child(2n) {
434
+ background-color: #f8f8f8;
435
+ }
436
+
437
+ .markdown-body img {
438
+ max-width: 100%;
439
+ box-sizing: border-box;
440
+ }
441
+
442
+ .markdown-body code {
443
+ padding: 0;
444
+ padding-top: 0.2em;
445
+ padding-bottom: 0.2em;
446
+ margin: 0;
447
+ font-size: 85%;
448
+ background-color: rgba(0,0,0,0.04);
449
+ border-radius: 3px;
450
+ }
451
+
452
+ .markdown-body code:before,
453
+ .markdown-body code:after {
454
+ letter-spacing: -0.2em;
455
+ content: "\00a0";
456
+ }
457
+
458
+ .markdown-body pre>code {
459
+ padding: 0;
460
+ margin: 0;
461
+ font-size: 100%;
462
+ word-break: normal;
463
+ white-space: pre;
464
+ background: transparent;
465
+ border: 0;
466
+ }
467
+
468
+ .markdown-body .highlight {
469
+ margin-bottom: 16px;
470
+ }
471
+
472
+ .markdown-body .highlight pre,
473
+ .markdown-body pre {
474
+ padding: 16px;
475
+ overflow: auto;
476
+ font-size: 85%;
477
+ line-height: 1.45;
478
+ background-color: #f7f7f7;
479
+ border-radius: 3px;
480
+ }
481
+
482
+ .markdown-body .highlight pre {
483
+ margin-bottom: 0;
484
+ word-break: normal;
485
+ }
486
+
487
+ .markdown-body pre {
488
+ word-wrap: normal;
489
+ }
490
+
491
+ .markdown-body pre code {
492
+ display: inline;
493
+ max-width: initial;
494
+ padding: 0;
495
+ margin: 0;
496
+ overflow: initial;
497
+ line-height: inherit;
498
+ word-wrap: normal;
499
+ background-color: transparent;
500
+ border: 0;
501
+ }
502
+
503
+ .markdown-body pre code:before,
504
+ .markdown-body pre code:after {
505
+ content: normal;
506
+ }
507
+
508
+ .markdown-body kbd {
509
+ display: inline-block;
510
+ padding: 3px 5px;
511
+ font-size: 11px;
512
+ line-height: 10px;
513
+ color: #555;
514
+ vertical-align: middle;
515
+ background-color: #fcfcfc;
516
+ border: solid 1px #ccc;
517
+ border-bottom-color: #bbb;
518
+ border-radius: 3px;
519
+ box-shadow: inset 0 -1px 0 #bbb;
520
+ }
521
+
522
+ .markdown-body .pl-c {
523
+ color: #969896;
524
+ }
525
+
526
+ .markdown-body .pl-c1,
527
+ .markdown-body .pl-s .pl-v {
528
+ color: #0086b3;
529
+ }
530
+
531
+ .markdown-body .pl-e,
532
+ .markdown-body .pl-en {
533
+ color: #795da3;
534
+ }
535
+
536
+ .markdown-body .pl-s .pl-s1,
537
+ .markdown-body .pl-smi {
538
+ color: #333;
539
+ }
540
+
541
+ .markdown-body .pl-ent {
542
+ color: #63a35c;
543
+ }
544
+
545
+ .markdown-body .pl-k {
546
+ color: #a71d5d;
547
+ }
548
+
549
+ .markdown-body .pl-pds,
550
+ .markdown-body .pl-s,
551
+ .markdown-body .pl-s .pl-pse .pl-s1,
552
+ .markdown-body .pl-sr,
553
+ .markdown-body .pl-sr .pl-cce,
554
+ .markdown-body .pl-sr .pl-sra,
555
+ .markdown-body .pl-sr .pl-sre {
556
+ color: #183691;
557
+ }
558
+
559
+ .markdown-body .pl-v {
560
+ color: #ed6a43;
561
+ }
562
+
563
+ .markdown-body .pl-id {
564
+ color: #b52a1d;
565
+ }
566
+
567
+ .markdown-body .pl-ii {
568
+ background-color: #b52a1d;
569
+ color: #f8f8f8;
570
+ }
571
+
572
+ .markdown-body .pl-sr .pl-cce {
573
+ color: #63a35c;
574
+ font-weight: bold;
575
+ }
576
+
577
+ .markdown-body .pl-ml {
578
+ color: #693a17;
579
+ }
580
+
581
+ .markdown-body .pl-mh,
582
+ .markdown-body .pl-mh .pl-en,
583
+ .markdown-body .pl-ms {
584
+ color: #1d3e81;
585
+ font-weight: bold;
586
+ }
587
+
588
+ .markdown-body .pl-mq {
589
+ color: #008080;
590
+ }
591
+
592
+ .markdown-body .pl-mi {
593
+ color: #333;
594
+ font-style: italic;
595
+ }
596
+
597
+ .markdown-body .pl-mb {
598
+ color: #333;
599
+ font-weight: bold;
600
+ }
601
+
602
+ .markdown-body .pl-md {
603
+ background-color: #ffecec;
604
+ color: #bd2c00;
605
+ }
606
+
607
+ .markdown-body .pl-mi1 {
608
+ background-color: #eaffea;
609
+ color: #55a532;
610
+ }
611
+
612
+ .markdown-body .pl-mdr {
613
+ color: #795da3;
614
+ font-weight: bold;
615
+ }
616
+
617
+ .markdown-body .pl-mo {
618
+ color: #1d3e81;
619
+ }
620
+
621
+ .markdown-body kbd {
622
+ display: inline-block;
623
+ padding: 3px 5px;
624
+ font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace;
625
+ line-height: 10px;
626
+ color: #555;
627
+ vertical-align: middle;
628
+ background-color: #fcfcfc;
629
+ border: solid 1px #ccc;
630
+ border-bottom-color: #bbb;
631
+ border-radius: 3px;
632
+ box-shadow: inset 0 -1px 0 #bbb;
633
+ }
634
+
635
+ .markdown-body .task-list-item {
636
+ list-style-type: none;
637
+ }
638
+
639
+ .markdown-body .task-list-item+.task-list-item {
640
+ margin-top: 3px;
641
+ }
642
+
643
+ .markdown-body .task-list-item input {
644
+ margin: 0 0.35em 0.25em -1.6em;
645
+ vertical-align: middle;
646
+ }
647
+
648
+ .markdown-body :checked+.radio-label {
649
+ z-index: 1;
650
+ position: relative;
651
+ border-color: #4078c0;
652
+ }