gh-preview 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ }