octodown 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,61 +1 @@
1
- .highlight .hll { background-color: #ffffcc }
2
- .highlight .c { color: #999988; font-style: italic } /* Comment */
3
- .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
4
- .highlight .k { color: #000000; font-weight: bold } /* Keyword */
5
- .highlight .o { color: #000000; font-weight: bold } /* Operator */
6
- .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
7
- .highlight .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
8
- .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
9
- .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
10
- .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
11
- .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
12
- .highlight .gr { color: #aa0000 } /* Generic.Error */
13
- .highlight .gh { color: #999999 } /* Generic.Heading */
14
- .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
15
- .highlight .go { color: #888888 } /* Generic.Output */
16
- .highlight .gp { color: #555555 } /* Generic.Prompt */
17
- .highlight .gs { font-weight: bold } /* Generic.Strong */
18
- .highlight .gu { color: #aaaaaa } /* Generic.Subheading */
19
- .highlight .gt { color: #aa0000 } /* Generic.Traceback */
20
- .highlight .kc { color: #000000; font-weight: bold } /* Keyword.Constant */
21
- .highlight .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
22
- .highlight .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */
23
- .highlight .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
24
- .highlight .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
25
- .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
26
- .highlight .m { color: #009999 } /* Literal.Number */
27
- .highlight .s { color: #d01040 } /* Literal.String */
28
- .highlight .na { color: #008080 } /* Name.Attribute */
29
- .highlight .nb { color: #0086B3 } /* Name.Builtin */
30
- .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
31
- .highlight .no { color: #008080 } /* Name.Constant */
32
- .highlight .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */
33
- .highlight .ni { color: #800080 } /* Name.Entity */
34
- .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
35
- .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
36
- .highlight .nl { color: #990000; font-weight: bold } /* Name.Label */
37
- .highlight .nn { color: #555555 } /* Name.Namespace */
38
- .highlight .nt { color: #000080 } /* Name.Tag */
39
- .highlight .nv { color: #008080 } /* Name.Variable */
40
- .highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */
41
- .highlight .w { color: #bbbbbb } /* Text.Whitespace */
42
- .highlight .mf { color: #009999 } /* Literal.Number.Float */
43
- .highlight .mh { color: #009999 } /* Literal.Number.Hex */
44
- .highlight .mi { color: #009999 } /* Literal.Number.Integer */
45
- .highlight .mo { color: #009999 } /* Literal.Number.Oct */
46
- .highlight .sb { color: #d01040 } /* Literal.String.Backtick */
47
- .highlight .sc { color: #d01040 } /* Literal.String.Char */
48
- .highlight .sd { color: #d01040 } /* Literal.String.Doc */
49
- .highlight .s2 { color: #d01040 } /* Literal.String.Double */
50
- .highlight .se { color: #d01040 } /* Literal.String.Escape */
51
- .highlight .sh { color: #d01040 } /* Literal.String.Heredoc */
52
- .highlight .si { color: #d01040 } /* Literal.String.Interpol */
53
- .highlight .sx { color: #d01040 } /* Literal.String.Other */
54
- .highlight .sr { color: #009926 } /* Literal.String.Regex */
55
- .highlight .s1 { color: #d01040 } /* Literal.String.Single */
56
- .highlight .ss { color: #990073 } /* Literal.String.Symbol */
57
- .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
58
- .highlight .vc { color: #008080 } /* Name.Variable.Class */
59
- .highlight .vg { color: #008080 } /* Name.Variable.Global */
60
- .highlight .vi { color: #008080 } /* Name.Variable.Instance */
61
- .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
1
+ .highlight table td{padding:5px}.highlight table pre{margin:0}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:700}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:700;font-style:italic}.highlight .c,.highlight .cd{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .gd{color:#000;background-color:#fdd}.highlight .ge{color:#000;font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:700}.highlight .gu{color:#aaa}.highlight .gt{color:#a00}.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{color:#000;font-weight:700}.highlight .kt{color:#458;font-weight:700}.highlight .k,.highlight .kv{color:#000;font-weight:700}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo,.highlight .mx{color:#099}.highlight .s2,.highlight .sb,.highlight .sc,.highlight .sd,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .s{color:#d14}.highlight .na{color:teal}.highlight .bp{color:#999}.highlight .nb{color:#0086B3}.highlight .nc{color:#458;font-weight:700}.highlight .no{color:teal}.highlight .nd{color:#3c5d5d;font-weight:700}.highlight .ni{color:purple}.highlight .ne,.highlight .nf,.highlight .nl{color:#900;font-weight:700}.highlight .nn{color:#555}.highlight .nt{color:navy}.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:teal}.highlight .o,.highlight .ow{color:#000;font-weight:700}.highlight .w{color:#bbb}.highlight{background-color:#f8f8f8}
@@ -8,7 +8,6 @@ include Octodown
8
8
 
9
9
  # Default options
10
10
  options = {
11
- gfm: false,
12
11
  port: 8080,
13
12
  presenter: :html,
14
13
  style: :github
@@ -33,10 +32,6 @@ OptionParser.new do |opts|
33
32
  options[:presenter] = :raw
34
33
  end
35
34
 
36
- opts.on '-g', '--gfm', 'Use for non-README files (comments, etc)' do |g|
37
- options[:gfm] = g
38
- end
39
-
40
35
  opts.on '-l', '--live-reload', 'Start a LiveReload server' do
41
36
  options[:presenter] = :server
42
37
  end
@@ -0,0 +1,43 @@
1
+ # Monkey patch until https://github.com/jch/html-pipeline/pull/295/files is merged
2
+ module HTML
3
+ class Pipeline
4
+ # HTML Filter that syntax highlights code blocks wrapped
5
+ # in <pre lang="...">.
6
+ class SyntaxHighlightFilterPatch < Filter
7
+ def initialize(*args)
8
+ super(*args)
9
+ @formatter = Rouge::Formatters::HTML.new
10
+ end
11
+
12
+ def call
13
+ doc.search('pre').each do |node|
14
+ default = context[:highlight] && context[:highlight].to_s
15
+ next unless lang = node['lang'] || default
16
+ next unless lexer = lexer_for(lang)
17
+ text = node.inner_text
18
+
19
+ html = highlight_with_timeout_handling(text, lang)
20
+ next if html.nil?
21
+
22
+ node.inner_html = html
23
+ klass = node['class']
24
+ scope = context[:scope] || "highlight-#{lang}"
25
+ klass = [klass, scope].compact.join ' '
26
+
27
+ node['class'] = klass
28
+ end
29
+ doc
30
+ end
31
+
32
+ def highlight_with_timeout_handling(text, lang)
33
+ Rouge.highlight(text, lang, @formatter)
34
+ rescue Timeout::Error => _
35
+ nil
36
+ end
37
+
38
+ def lexer_for(lang)
39
+ Rouge::Lexer.find(lang)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,6 +1,6 @@
1
- require 'github/markup'
1
+ require 'rouge'
2
2
  require 'html/pipeline'
3
- require 'html/pipeline/rouge_filter'
3
+ require_relative './../../html/pipeline/syntax_hightlight_filter'
4
4
  require 'task_list/filter'
5
5
  require 'octodown/renderer/renderable'
6
6
 
@@ -36,20 +36,21 @@ module Octodown
36
36
  {
37
37
  asset_root: 'https://assets-cdn.github.com/images/icons/',
38
38
  server: options[:presenter] == :server,
39
- original_document_root: document_root
39
+ original_document_root: document_root,
40
+ scope: 'highlight'
40
41
  }
41
42
  end
42
43
 
43
44
  def pipeline
44
45
  Pipeline.new [
45
46
  Pipeline::MarkdownFilter,
47
+ Pipeline::SyntaxHighlightFilterPatch,
46
48
  Support::RelativeRootFilter,
47
49
  Pipeline::ImageMaxWidthFilter,
48
50
  Pipeline::MentionFilter,
49
51
  Pipeline::EmojiFilter,
50
- Pipeline::RougeFilter,
51
52
  TaskList::Filter
52
- ], context.merge(gfm: options[:gfm])
53
+ ], context
53
54
  end
54
55
 
55
56
  def document_root
@@ -63,7 +63,7 @@ module Octodown
63
63
 
64
64
  private
65
65
 
66
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
66
+ # rubocop:disable Metrics/MethodLength
67
67
  def render_ws(env)
68
68
  md = render_md(file)
69
69
 
@@ -90,7 +90,7 @@ module Octodown
90
90
  @websockets << socket
91
91
  socket.rack_response
92
92
  end
93
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
93
+ # rubocop:enable Metrics/MethodLength
94
94
 
95
95
  def render_http(env)
96
96
  Rack::Response.new.tap do |res|
@@ -42,8 +42,18 @@
42
42
  </head>
43
43
 
44
44
  <body>
45
- <article class="markdown-body">
46
- <%= rendered_markdown %>
47
- </article>
45
+ <div class="container" style="margin-top: 20px;">
46
+ <div class="repository-content ">
47
+ <div id="readme" class="readme boxed-group clearfix announce instapaper_body md">
48
+ <h3>
49
+ <svg class="octicon octicon-book" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M3 5h4v1H3V5zm0 3h4V7H3v1zm0 2h4V9H3v1zm11-5h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm2-6v9c0 .55-.45 1-1 1H9.5l-1 1-1-1H2c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h5.5l1 1 1-1H15c.55 0 1 .45 1 1zm-8 .5L7.5 3H2v9h6V3.5zm7-.5H9.5l-.5.5V12h6V3z"/></svg>
50
+ README.md
51
+ </h3>
52
+ <article class="markdown-body entry-content">
53
+ <%= rendered_markdown %>
54
+ </article>
55
+ </div>
56
+ </div>
57
+ </div>
48
58
  </body>
49
59
  </html>
@@ -1,3 +1,3 @@
1
1
  module Octodown
2
- VERSION = '1.6.0'.freeze
2
+ VERSION = '1.7.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,119 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octodown
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Ker-Seymer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-12 00:00:00.000000000 Z
11
+ date: 2018-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: github-markup
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.4'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.4'
27
- - !ruby/object:Gem::Dependency
28
- name: github-linguist
14
+ name: commonmarker
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '5.0'
19
+ version: '0.17'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '5.0'
26
+ version: '0.17'
41
27
  - !ruby/object:Gem::Dependency
42
- name: html-pipeline
28
+ name: deckar01-task_list
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '2.6'
33
+ version: '2.0'
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '2.6'
40
+ version: '2.0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: commonmarker
42
+ name: faye-websocket
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '0.14'
47
+ version: '0.10'
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: '0.14'
54
+ version: '0.10'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: gemoji
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '3.0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.0'
83
- - !ruby/object:Gem::Dependency
84
- name: html-pipeline-rouge_filter
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.0'
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 1.0.2
61
+ version: '2.0'
93
62
  type: :runtime
94
63
  prerelease: false
95
64
  version_requirements: !ruby/object:Gem::Requirement
96
65
  requirements:
97
66
  - - "~>"
98
67
  - !ruby/object:Gem::Version
99
- version: '1.0'
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: 1.0.2
68
+ version: '2.0'
103
69
  - !ruby/object:Gem::Dependency
104
- name: deckar01-task_list
70
+ name: html-pipeline
105
71
  requirement: !ruby/object:Gem::Requirement
106
72
  requirements:
107
73
  - - "~>"
108
74
  - !ruby/object:Gem::Version
109
- version: '2.0'
75
+ version: 2.7.2
110
76
  type: :runtime
111
77
  prerelease: false
112
78
  version_requirements: !ruby/object:Gem::Requirement
113
79
  requirements:
114
80
  - - "~>"
115
81
  - !ruby/object:Gem::Version
116
- version: '2.0'
82
+ version: 2.7.2
117
83
  - !ruby/object:Gem::Dependency
118
84
  name: launchy
119
85
  requirement: !ruby/object:Gem::Requirement
@@ -135,109 +101,103 @@ dependencies:
135
101
  - !ruby/object:Gem::Version
136
102
  version: 2.4.3
137
103
  - !ruby/object:Gem::Dependency
138
- name: rack
104
+ name: listen
139
105
  requirement: !ruby/object:Gem::Requirement
140
106
  requirements:
141
107
  - - "~>"
142
108
  - !ruby/object:Gem::Version
143
- version: '2.0'
109
+ version: '3.1'
144
110
  type: :runtime
145
111
  prerelease: false
146
112
  version_requirements: !ruby/object:Gem::Requirement
147
113
  requirements:
148
114
  - - "~>"
149
115
  - !ruby/object:Gem::Version
150
- version: '2.0'
116
+ version: '3.1'
151
117
  - !ruby/object:Gem::Dependency
152
- name: listen
118
+ name: puma
153
119
  requirement: !ruby/object:Gem::Requirement
154
120
  requirements:
155
121
  - - "~>"
156
122
  - !ruby/object:Gem::Version
157
- version: '3.1'
123
+ version: '3.7'
158
124
  type: :runtime
159
125
  prerelease: false
160
126
  version_requirements: !ruby/object:Gem::Requirement
161
127
  requirements:
162
128
  - - "~>"
163
129
  - !ruby/object:Gem::Version
164
- version: '3.1'
130
+ version: '3.7'
165
131
  - !ruby/object:Gem::Dependency
166
- name: faye-websocket
132
+ name: rack
167
133
  requirement: !ruby/object:Gem::Requirement
168
134
  requirements:
169
135
  - - "~>"
170
136
  - !ruby/object:Gem::Version
171
- version: '0.10'
137
+ version: '2.0'
172
138
  type: :runtime
173
139
  prerelease: false
174
140
  version_requirements: !ruby/object:Gem::Requirement
175
141
  requirements:
176
142
  - - "~>"
177
143
  - !ruby/object:Gem::Version
178
- version: '0.10'
144
+ version: '2.0'
179
145
  - !ruby/object:Gem::Dependency
180
- name: puma
146
+ name: rouge
181
147
  requirement: !ruby/object:Gem::Requirement
182
148
  requirements:
183
149
  - - "~>"
184
150
  - !ruby/object:Gem::Version
185
- version: '3.7'
151
+ version: '3.1'
186
152
  type: :runtime
187
153
  prerelease: false
188
154
  version_requirements: !ruby/object:Gem::Requirement
189
155
  requirements:
190
156
  - - "~>"
191
157
  - !ruby/object:Gem::Version
192
- version: '3.7'
158
+ version: '3.1'
193
159
  - !ruby/object:Gem::Dependency
194
- name: rspec
160
+ name: bundler
195
161
  requirement: !ruby/object:Gem::Requirement
196
162
  requirements:
197
163
  - - "~>"
198
164
  - !ruby/object:Gem::Version
199
- version: '3.3'
165
+ version: '1.7'
200
166
  type: :development
201
167
  prerelease: false
202
168
  version_requirements: !ruby/object:Gem::Requirement
203
169
  requirements:
204
170
  - - "~>"
205
171
  - !ruby/object:Gem::Version
206
- version: '3.3'
172
+ version: '1.7'
207
173
  - !ruby/object:Gem::Dependency
208
- name: rubocop
174
+ name: octokit
209
175
  requirement: !ruby/object:Gem::Requirement
210
176
  requirements:
211
- - - "~>"
212
- - !ruby/object:Gem::Version
213
- version: '0.34'
214
177
  - - ">="
215
178
  - !ruby/object:Gem::Version
216
- version: 0.34.2
179
+ version: '0'
217
180
  type: :development
218
181
  prerelease: false
219
182
  version_requirements: !ruby/object:Gem::Requirement
220
183
  requirements:
221
- - - "~>"
222
- - !ruby/object:Gem::Version
223
- version: '0.34'
224
184
  - - ">="
225
185
  - !ruby/object:Gem::Version
226
- version: 0.34.2
186
+ version: '0'
227
187
  - !ruby/object:Gem::Dependency
228
- name: bundler
188
+ name: rack-test
229
189
  requirement: !ruby/object:Gem::Requirement
230
190
  requirements:
231
191
  - - "~>"
232
192
  - !ruby/object:Gem::Version
233
- version: '1.7'
193
+ version: '1.0'
234
194
  type: :development
235
195
  prerelease: false
236
196
  version_requirements: !ruby/object:Gem::Requirement
237
197
  requirements:
238
198
  - - "~>"
239
199
  - !ruby/object:Gem::Version
240
- version: '1.7'
200
+ version: '1.0'
241
201
  - !ruby/object:Gem::Dependency
242
202
  name: rake
243
203
  requirement: !ruby/object:Gem::Requirement
@@ -253,39 +213,39 @@ dependencies:
253
213
  - !ruby/object:Gem::Version
254
214
  version: '12.1'
255
215
  - !ruby/object:Gem::Dependency
256
- name: rack-test
216
+ name: rspec
257
217
  requirement: !ruby/object:Gem::Requirement
258
218
  requirements:
259
219
  - - "~>"
260
220
  - !ruby/object:Gem::Version
261
- version: '0.6'
262
- - - ">="
263
- - !ruby/object:Gem::Version
264
- version: 0.6.3
221
+ version: '3.3'
265
222
  type: :development
266
223
  prerelease: false
267
224
  version_requirements: !ruby/object:Gem::Requirement
268
225
  requirements:
269
226
  - - "~>"
270
227
  - !ruby/object:Gem::Version
271
- version: '0.6'
272
- - - ">="
273
- - !ruby/object:Gem::Version
274
- version: 0.6.3
228
+ version: '3.3'
275
229
  - !ruby/object:Gem::Dependency
276
- name: octokit
230
+ name: rubocop
277
231
  requirement: !ruby/object:Gem::Requirement
278
232
  requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '0.34'
279
236
  - - ">="
280
237
  - !ruby/object:Gem::Version
281
- version: '0'
238
+ version: 0.34.2
282
239
  type: :development
283
240
  prerelease: false
284
241
  version_requirements: !ruby/object:Gem::Requirement
285
242
  requirements:
243
+ - - "~>"
244
+ - !ruby/object:Gem::Version
245
+ version: '0.34'
286
246
  - - ">="
287
247
  - !ruby/object:Gem::Version
288
- version: '0'
248
+ version: 0.34.2
289
249
  description:
290
250
  email:
291
251
  - i.kerseymer@gmail.com
@@ -299,6 +259,7 @@ files:
299
259
  - assets/github.css
300
260
  - assets/highlight.css
301
261
  - bin/octodown
262
+ - lib/html/pipeline/syntax_hightlight_filter.rb
302
263
  - lib/octodown.rb
303
264
  - lib/octodown/renderer/github_markdown.rb
304
265
  - lib/octodown/renderer/html.rb
@@ -332,7 +293,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
332
293
  version: '0'
333
294
  requirements: []
334
295
  rubyforge_project:
335
- rubygems_version: 2.5.2
296
+ rubygems_version: 2.6.14
336
297
  signing_key:
337
298
  specification_version: 4
338
299
  summary: GitHub Markdown straight from your shell.