marked-rails 0.0.2
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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +44 -0
- data/Rakefile +2 -0
- data/lib/marked-rails.rb +7 -0
- data/lib/marked-rails/engine.rb +6 -0
- data/lib/marked-rails/version.rb +5 -0
- data/marked-rails.gemspec +17 -0
- data/vendor/assets/javascripts/marked.js +781 -0
- metadata +56 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 nodanaonlyzuul
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Marked::Rails
|
2
|
+
|
3
|
+
[Marked]("https://github.com/chjj/marked") is an awesome, fast Markdown parser and compiler.
|
4
|
+
This is marked - wrapped in a gem - to make use of rubygems as a package manager.
|
5
|
+
Marked is also available through Node Package Manager, but if you're working in Rails it's nice
|
6
|
+
to have in gem form for simple integration into your rails apps.
|
7
|
+
|
8
|
+
We are currently tracking marked version 0.2.5
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
gem 'marked-rails'
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install marked-rails
|
23
|
+
|
24
|
+
## Usage (With Asset Pipeline)
|
25
|
+
|
26
|
+
```js
|
27
|
+
//= require marked
|
28
|
+
```
|
29
|
+
|
30
|
+
## Usage (Without Asset Pipeline)
|
31
|
+
|
32
|
+
_Coming soon_
|
33
|
+
|
34
|
+
## Contributing
|
35
|
+
|
36
|
+
Feel free to open an issue ticket if you find something that could be improved. A couple notes:
|
37
|
+
|
38
|
+
* If it's an issue pertaining to the marked javascript, please report it to the [marked project](https://github.com/chjj/marked).
|
39
|
+
|
40
|
+
* If the marked scripts are outdated (i.e. maybe a new version of marked was released yesterday), feel free to open an issue and prod us to get that thing updated.
|
41
|
+
|
42
|
+
## Acknowledgements
|
43
|
+
|
44
|
+
* This README is __heavily__ inspired by the one for [jquery-rails](https://github.com/rails/jquery-rails)
|
data/Rakefile
ADDED
data/lib/marked-rails.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/marked-rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["nodanaonlyzuul"]
|
6
|
+
gem.email = ["stephen@eastmedia.com"]
|
7
|
+
gem.description = 'A gemified verison of the chjj/marked: "A full-featured markdown parser and compiler, written in javascript."'
|
8
|
+
gem.summary = 'A gemified verison of the chjj/marked'
|
9
|
+
gem.homepage = "https://github.com/eastmedia/marked-rails"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "marked-rails"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Marked::Rails::VERSION
|
17
|
+
end
|
@@ -0,0 +1,781 @@
|
|
1
|
+
/**
|
2
|
+
* marked - A markdown parser (https://github.com/chjj/marked)
|
3
|
+
* Copyright (c) 2011-2012, Christopher Jeffrey. (MIT Licensed)
|
4
|
+
*/
|
5
|
+
|
6
|
+
;(function() {
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Block-Level Grammar
|
10
|
+
*/
|
11
|
+
|
12
|
+
var block = {
|
13
|
+
newline: /^\n+/,
|
14
|
+
code: /^( {4}[^\n]+\n*)+/,
|
15
|
+
fences: noop,
|
16
|
+
hr: /^( *[-*_]){3,} *(?:\n+|$)/,
|
17
|
+
heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
|
18
|
+
lheading: /^([^\n]+)\n *(=|-){3,} *\n*/,
|
19
|
+
blockquote: /^( *>[^\n]+(\n[^\n]+)*\n*)+/,
|
20
|
+
list: /^( *)(bull) [^\0]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
|
21
|
+
html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,
|
22
|
+
def: /^ *\[([^\]]+)\]: *([^\s]+)(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
|
23
|
+
paragraph: /^([^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+\n*/,
|
24
|
+
text: /^[^\n]+/
|
25
|
+
};
|
26
|
+
|
27
|
+
block.bullet = /(?:[*+-]|\d+\.)/;
|
28
|
+
block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
|
29
|
+
block.item = replace(block.item, 'gm')
|
30
|
+
(/bull/g, block.bullet)
|
31
|
+
();
|
32
|
+
|
33
|
+
block.list = replace(block.list)
|
34
|
+
(/bull/g, block.bullet)
|
35
|
+
('hr', /\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)
|
36
|
+
();
|
37
|
+
|
38
|
+
block.html = replace(block.html)
|
39
|
+
('comment', /<!--[^\0]*?-->/)
|
40
|
+
('closed', /<(tag)[^\0]+?<\/\1>/)
|
41
|
+
('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
|
42
|
+
(/tag/g, tag())
|
43
|
+
();
|
44
|
+
|
45
|
+
block.paragraph = replace(block.paragraph)
|
46
|
+
('hr', block.hr)
|
47
|
+
('heading', block.heading)
|
48
|
+
('lheading', block.lheading)
|
49
|
+
('blockquote', block.blockquote)
|
50
|
+
('tag', '<' + tag())
|
51
|
+
('def', block.def)
|
52
|
+
();
|
53
|
+
|
54
|
+
block.normal = {
|
55
|
+
fences: block.fences,
|
56
|
+
paragraph: block.paragraph
|
57
|
+
};
|
58
|
+
|
59
|
+
block.gfm = {
|
60
|
+
fences: /^ *(```|~~~) *(\w+)? *\n([^\0]+?)\s*\1 *(?:\n+|$)/,
|
61
|
+
paragraph: /^/
|
62
|
+
};
|
63
|
+
|
64
|
+
block.gfm.paragraph = replace(block.paragraph)
|
65
|
+
('(?!', '(?!' + block.gfm.fences.source.replace('\\1', '\\2') + '|')
|
66
|
+
();
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Block Lexer
|
70
|
+
*/
|
71
|
+
|
72
|
+
block.lexer = function(src) {
|
73
|
+
var tokens = [];
|
74
|
+
|
75
|
+
tokens.links = {};
|
76
|
+
|
77
|
+
src = src
|
78
|
+
.replace(/\r\n|\r/g, '\n')
|
79
|
+
.replace(/\t/g, ' ');
|
80
|
+
|
81
|
+
return block.token(src, tokens, true);
|
82
|
+
};
|
83
|
+
|
84
|
+
block.token = function(src, tokens, top) {
|
85
|
+
var src = src.replace(/^ +$/gm, '')
|
86
|
+
, next
|
87
|
+
, loose
|
88
|
+
, cap
|
89
|
+
, item
|
90
|
+
, space
|
91
|
+
, i
|
92
|
+
, l;
|
93
|
+
|
94
|
+
while (src) {
|
95
|
+
// newline
|
96
|
+
if (cap = block.newline.exec(src)) {
|
97
|
+
src = src.substring(cap[0].length);
|
98
|
+
if (cap[0].length > 1) {
|
99
|
+
tokens.push({
|
100
|
+
type: 'space'
|
101
|
+
});
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
// code
|
106
|
+
if (cap = block.code.exec(src)) {
|
107
|
+
src = src.substring(cap[0].length);
|
108
|
+
cap = cap[0].replace(/^ {4}/gm, '');
|
109
|
+
tokens.push({
|
110
|
+
type: 'code',
|
111
|
+
text: !options.pedantic
|
112
|
+
? cap.replace(/\n+$/, '')
|
113
|
+
: cap
|
114
|
+
});
|
115
|
+
continue;
|
116
|
+
}
|
117
|
+
|
118
|
+
// fences (gfm)
|
119
|
+
if (cap = block.fences.exec(src)) {
|
120
|
+
src = src.substring(cap[0].length);
|
121
|
+
tokens.push({
|
122
|
+
type: 'code',
|
123
|
+
lang: cap[2],
|
124
|
+
text: cap[3]
|
125
|
+
});
|
126
|
+
continue;
|
127
|
+
}
|
128
|
+
|
129
|
+
// heading
|
130
|
+
if (cap = block.heading.exec(src)) {
|
131
|
+
src = src.substring(cap[0].length);
|
132
|
+
tokens.push({
|
133
|
+
type: 'heading',
|
134
|
+
depth: cap[1].length,
|
135
|
+
text: cap[2]
|
136
|
+
});
|
137
|
+
continue;
|
138
|
+
}
|
139
|
+
|
140
|
+
// lheading
|
141
|
+
if (cap = block.lheading.exec(src)) {
|
142
|
+
src = src.substring(cap[0].length);
|
143
|
+
tokens.push({
|
144
|
+
type: 'heading',
|
145
|
+
depth: cap[2] === '=' ? 1 : 2,
|
146
|
+
text: cap[1]
|
147
|
+
});
|
148
|
+
continue;
|
149
|
+
}
|
150
|
+
|
151
|
+
// hr
|
152
|
+
if (cap = block.hr.exec(src)) {
|
153
|
+
src = src.substring(cap[0].length);
|
154
|
+
tokens.push({
|
155
|
+
type: 'hr'
|
156
|
+
});
|
157
|
+
continue;
|
158
|
+
}
|
159
|
+
|
160
|
+
// blockquote
|
161
|
+
if (cap = block.blockquote.exec(src)) {
|
162
|
+
src = src.substring(cap[0].length);
|
163
|
+
|
164
|
+
tokens.push({
|
165
|
+
type: 'blockquote_start'
|
166
|
+
});
|
167
|
+
|
168
|
+
cap = cap[0].replace(/^ *> ?/gm, '');
|
169
|
+
|
170
|
+
// Pass `top` to keep the current
|
171
|
+
// "toplevel" state. This is exactly
|
172
|
+
// how markdown.pl works.
|
173
|
+
block.token(cap, tokens, top);
|
174
|
+
|
175
|
+
tokens.push({
|
176
|
+
type: 'blockquote_end'
|
177
|
+
});
|
178
|
+
|
179
|
+
continue;
|
180
|
+
}
|
181
|
+
|
182
|
+
// list
|
183
|
+
if (cap = block.list.exec(src)) {
|
184
|
+
src = src.substring(cap[0].length);
|
185
|
+
|
186
|
+
tokens.push({
|
187
|
+
type: 'list_start',
|
188
|
+
ordered: isFinite(cap[2])
|
189
|
+
});
|
190
|
+
|
191
|
+
// Get each top-level item.
|
192
|
+
cap = cap[0].match(block.item);
|
193
|
+
|
194
|
+
next = false;
|
195
|
+
l = cap.length;
|
196
|
+
i = 0;
|
197
|
+
|
198
|
+
for (; i < l; i++) {
|
199
|
+
item = cap[i];
|
200
|
+
|
201
|
+
// Remove the list item's bullet
|
202
|
+
// so it is seen as the next token.
|
203
|
+
space = item.length;
|
204
|
+
item = item.replace(/^ *([*+-]|\d+\.) +/, '');
|
205
|
+
|
206
|
+
// Outdent whatever the
|
207
|
+
// list item contains. Hacky.
|
208
|
+
if (~item.indexOf('\n ')) {
|
209
|
+
space -= item.length;
|
210
|
+
item = !options.pedantic
|
211
|
+
? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
|
212
|
+
: item.replace(/^ {1,4}/gm, '');
|
213
|
+
}
|
214
|
+
|
215
|
+
// Determine whether item is loose or not.
|
216
|
+
// Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
|
217
|
+
// for discount behavior.
|
218
|
+
loose = next || /\n\n(?!\s*$)/.test(item);
|
219
|
+
if (i !== l - 1) {
|
220
|
+
next = item[item.length-1] === '\n';
|
221
|
+
if (!loose) loose = next;
|
222
|
+
}
|
223
|
+
|
224
|
+
tokens.push({
|
225
|
+
type: loose
|
226
|
+
? 'loose_item_start'
|
227
|
+
: 'list_item_start'
|
228
|
+
});
|
229
|
+
|
230
|
+
// Recurse.
|
231
|
+
block.token(item, tokens);
|
232
|
+
|
233
|
+
tokens.push({
|
234
|
+
type: 'list_item_end'
|
235
|
+
});
|
236
|
+
}
|
237
|
+
|
238
|
+
tokens.push({
|
239
|
+
type: 'list_end'
|
240
|
+
});
|
241
|
+
|
242
|
+
continue;
|
243
|
+
}
|
244
|
+
|
245
|
+
// html
|
246
|
+
if (cap = block.html.exec(src)) {
|
247
|
+
src = src.substring(cap[0].length);
|
248
|
+
tokens.push({
|
249
|
+
type: options.sanitize
|
250
|
+
? 'paragraph'
|
251
|
+
: 'html',
|
252
|
+
pre: cap[1] === 'pre',
|
253
|
+
text: cap[0]
|
254
|
+
});
|
255
|
+
continue;
|
256
|
+
}
|
257
|
+
|
258
|
+
// def
|
259
|
+
if (top && (cap = block.def.exec(src))) {
|
260
|
+
src = src.substring(cap[0].length);
|
261
|
+
tokens.links[cap[1].toLowerCase()] = {
|
262
|
+
href: cap[2],
|
263
|
+
title: cap[3]
|
264
|
+
};
|
265
|
+
continue;
|
266
|
+
}
|
267
|
+
|
268
|
+
// top-level paragraph
|
269
|
+
if (top && (cap = block.paragraph.exec(src))) {
|
270
|
+
src = src.substring(cap[0].length);
|
271
|
+
tokens.push({
|
272
|
+
type: 'paragraph',
|
273
|
+
text: cap[0]
|
274
|
+
});
|
275
|
+
continue;
|
276
|
+
}
|
277
|
+
|
278
|
+
// text
|
279
|
+
if (cap = block.text.exec(src)) {
|
280
|
+
// Top-level should never reach here.
|
281
|
+
src = src.substring(cap[0].length);
|
282
|
+
tokens.push({
|
283
|
+
type: 'text',
|
284
|
+
text: cap[0]
|
285
|
+
});
|
286
|
+
continue;
|
287
|
+
}
|
288
|
+
}
|
289
|
+
|
290
|
+
return tokens;
|
291
|
+
};
|
292
|
+
|
293
|
+
/**
|
294
|
+
* Inline Processing
|
295
|
+
*/
|
296
|
+
|
297
|
+
var inline = {
|
298
|
+
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
|
299
|
+
autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
|
300
|
+
url: noop,
|
301
|
+
tag: /^<!--[^\0]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
|
302
|
+
link: /^!?\[(inside)\]\(href\)/,
|
303
|
+
reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
|
304
|
+
nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
|
305
|
+
strong: /^__([^\0]+?)__(?!_)|^\*\*([^\0]+?)\*\*(?!\*)/,
|
306
|
+
em: /^\b_((?:__|[^\0])+?)_\b|^\*((?:\*\*|[^\0])+?)\*(?!\*)/,
|
307
|
+
code: /^(`+)([^\0]*?[^`])\1(?!`)/,
|
308
|
+
br: /^ {2,}\n(?!\s*$)/,
|
309
|
+
text: /^[^\0]+?(?=[\\<!\[_*`]| {2,}\n|$)/
|
310
|
+
};
|
311
|
+
|
312
|
+
inline._linkInside = /(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;
|
313
|
+
inline._linkHref = /\s*<?([^\s]*?)>?(?:\s+['"]([^\0]*?)['"])?\s*/;
|
314
|
+
|
315
|
+
inline.link = replace(inline.link)
|
316
|
+
('inside', inline._linkInside)
|
317
|
+
('href', inline._linkHref)
|
318
|
+
();
|
319
|
+
|
320
|
+
inline.reflink = replace(inline.reflink)
|
321
|
+
('inside', inline._linkInside)
|
322
|
+
();
|
323
|
+
|
324
|
+
inline.normal = {
|
325
|
+
url: inline.url,
|
326
|
+
strong: inline.strong,
|
327
|
+
em: inline.em,
|
328
|
+
text: inline.text
|
329
|
+
};
|
330
|
+
|
331
|
+
inline.pedantic = {
|
332
|
+
strong: /^__(?=\S)([^\0]*?\S)__(?!_)|^\*\*(?=\S)([^\0]*?\S)\*\*(?!\*)/,
|
333
|
+
em: /^_(?=\S)([^\0]*?\S)_(?!_)|^\*(?=\S)([^\0]*?\S)\*(?!\*)/
|
334
|
+
};
|
335
|
+
|
336
|
+
inline.gfm = {
|
337
|
+
url: /^(https?:\/\/[^\s]+[^.,:;"')\]\s])/,
|
338
|
+
text: /^[^\0]+?(?=[\\<!\[_*`]|https?:\/\/| {2,}\n|$)/
|
339
|
+
};
|
340
|
+
|
341
|
+
/**
|
342
|
+
* Inline Lexer
|
343
|
+
*/
|
344
|
+
|
345
|
+
inline.lexer = function(src) {
|
346
|
+
var out = ''
|
347
|
+
, links = tokens.links
|
348
|
+
, link
|
349
|
+
, text
|
350
|
+
, href
|
351
|
+
, cap;
|
352
|
+
|
353
|
+
while (src) {
|
354
|
+
// escape
|
355
|
+
if (cap = inline.escape.exec(src)) {
|
356
|
+
src = src.substring(cap[0].length);
|
357
|
+
out += cap[1];
|
358
|
+
continue;
|
359
|
+
}
|
360
|
+
|
361
|
+
// autolink
|
362
|
+
if (cap = inline.autolink.exec(src)) {
|
363
|
+
src = src.substring(cap[0].length);
|
364
|
+
if (cap[2] === '@') {
|
365
|
+
text = cap[1][6] === ':'
|
366
|
+
? mangle(cap[1].substring(7))
|
367
|
+
: mangle(cap[1]);
|
368
|
+
href = mangle('mailto:') + text;
|
369
|
+
} else {
|
370
|
+
text = escape(cap[1]);
|
371
|
+
href = text;
|
372
|
+
}
|
373
|
+
out += '<a href="'
|
374
|
+
+ href
|
375
|
+
+ '">'
|
376
|
+
+ text
|
377
|
+
+ '</a>';
|
378
|
+
continue;
|
379
|
+
}
|
380
|
+
|
381
|
+
// url (gfm)
|
382
|
+
if (cap = inline.url.exec(src)) {
|
383
|
+
src = src.substring(cap[0].length);
|
384
|
+
text = escape(cap[1]);
|
385
|
+
href = text;
|
386
|
+
out += '<a href="'
|
387
|
+
+ href
|
388
|
+
+ '">'
|
389
|
+
+ text
|
390
|
+
+ '</a>';
|
391
|
+
continue;
|
392
|
+
}
|
393
|
+
|
394
|
+
// tag
|
395
|
+
if (cap = inline.tag.exec(src)) {
|
396
|
+
src = src.substring(cap[0].length);
|
397
|
+
out += options.sanitize
|
398
|
+
? escape(cap[0])
|
399
|
+
: cap[0];
|
400
|
+
continue;
|
401
|
+
}
|
402
|
+
|
403
|
+
// link
|
404
|
+
if (cap = inline.link.exec(src)) {
|
405
|
+
src = src.substring(cap[0].length);
|
406
|
+
out += outputLink(cap, {
|
407
|
+
href: cap[2],
|
408
|
+
title: cap[3]
|
409
|
+
});
|
410
|
+
continue;
|
411
|
+
}
|
412
|
+
|
413
|
+
// reflink, nolink
|
414
|
+
if ((cap = inline.reflink.exec(src))
|
415
|
+
|| (cap = inline.nolink.exec(src))) {
|
416
|
+
src = src.substring(cap[0].length);
|
417
|
+
link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
|
418
|
+
link = links[link.toLowerCase()];
|
419
|
+
if (!link || !link.href) {
|
420
|
+
out += cap[0][0];
|
421
|
+
src = cap[0].substring(1) + src;
|
422
|
+
continue;
|
423
|
+
}
|
424
|
+
out += outputLink(cap, link);
|
425
|
+
continue;
|
426
|
+
}
|
427
|
+
|
428
|
+
// strong
|
429
|
+
if (cap = inline.strong.exec(src)) {
|
430
|
+
src = src.substring(cap[0].length);
|
431
|
+
out += '<strong>'
|
432
|
+
+ inline.lexer(cap[2] || cap[1])
|
433
|
+
+ '</strong>';
|
434
|
+
continue;
|
435
|
+
}
|
436
|
+
|
437
|
+
// em
|
438
|
+
if (cap = inline.em.exec(src)) {
|
439
|
+
src = src.substring(cap[0].length);
|
440
|
+
out += '<em>'
|
441
|
+
+ inline.lexer(cap[2] || cap[1])
|
442
|
+
+ '</em>';
|
443
|
+
continue;
|
444
|
+
}
|
445
|
+
|
446
|
+
// code
|
447
|
+
if (cap = inline.code.exec(src)) {
|
448
|
+
src = src.substring(cap[0].length);
|
449
|
+
out += '<code>'
|
450
|
+
+ escape(cap[2], true)
|
451
|
+
+ '</code>';
|
452
|
+
continue;
|
453
|
+
}
|
454
|
+
|
455
|
+
// br
|
456
|
+
if (cap = inline.br.exec(src)) {
|
457
|
+
src = src.substring(cap[0].length);
|
458
|
+
out += '<br>';
|
459
|
+
continue;
|
460
|
+
}
|
461
|
+
|
462
|
+
// text
|
463
|
+
if (cap = inline.text.exec(src)) {
|
464
|
+
src = src.substring(cap[0].length);
|
465
|
+
out += escape(cap[0]);
|
466
|
+
continue;
|
467
|
+
}
|
468
|
+
}
|
469
|
+
|
470
|
+
return out;
|
471
|
+
};
|
472
|
+
|
473
|
+
function outputLink(cap, link) {
|
474
|
+
if (cap[0][0] !== '!') {
|
475
|
+
return '<a href="'
|
476
|
+
+ escape(link.href)
|
477
|
+
+ '"'
|
478
|
+
+ (link.title
|
479
|
+
? ' title="'
|
480
|
+
+ escape(link.title)
|
481
|
+
+ '"'
|
482
|
+
: '')
|
483
|
+
+ '>'
|
484
|
+
+ inline.lexer(cap[1])
|
485
|
+
+ '</a>';
|
486
|
+
} else {
|
487
|
+
return '<img src="'
|
488
|
+
+ escape(link.href)
|
489
|
+
+ '" alt="'
|
490
|
+
+ escape(cap[1])
|
491
|
+
+ '"'
|
492
|
+
+ (link.title
|
493
|
+
? ' title="'
|
494
|
+
+ escape(link.title)
|
495
|
+
+ '"'
|
496
|
+
: '')
|
497
|
+
+ '>';
|
498
|
+
}
|
499
|
+
}
|
500
|
+
|
501
|
+
/**
|
502
|
+
* Parsing
|
503
|
+
*/
|
504
|
+
|
505
|
+
var tokens
|
506
|
+
, token;
|
507
|
+
|
508
|
+
function next() {
|
509
|
+
return token = tokens.pop();
|
510
|
+
}
|
511
|
+
|
512
|
+
function tok() {
|
513
|
+
switch (token.type) {
|
514
|
+
case 'space': {
|
515
|
+
return '';
|
516
|
+
}
|
517
|
+
case 'hr': {
|
518
|
+
return '<hr>\n';
|
519
|
+
}
|
520
|
+
case 'heading': {
|
521
|
+
return '<h'
|
522
|
+
+ token.depth
|
523
|
+
+ '>'
|
524
|
+
+ inline.lexer(token.text)
|
525
|
+
+ '</h'
|
526
|
+
+ token.depth
|
527
|
+
+ '>\n';
|
528
|
+
}
|
529
|
+
case 'code': {
|
530
|
+
if (options.highlight) {
|
531
|
+
token.code = options.highlight(token.text, token.lang);
|
532
|
+
if (token.code != null && token.code !== token.text) {
|
533
|
+
token.escaped = true;
|
534
|
+
token.text = token.code;
|
535
|
+
}
|
536
|
+
}
|
537
|
+
|
538
|
+
if (!token.escaped) {
|
539
|
+
token.text = escape(token.text, true);
|
540
|
+
}
|
541
|
+
|
542
|
+
return '<pre><code'
|
543
|
+
+ (token.lang
|
544
|
+
? ' class="lang-'
|
545
|
+
+ token.lang
|
546
|
+
+ '"'
|
547
|
+
: '')
|
548
|
+
+ '>'
|
549
|
+
+ token.text
|
550
|
+
+ '</code></pre>\n';
|
551
|
+
}
|
552
|
+
case 'blockquote_start': {
|
553
|
+
var body = '';
|
554
|
+
|
555
|
+
while (next().type !== 'blockquote_end') {
|
556
|
+
body += tok();
|
557
|
+
}
|
558
|
+
|
559
|
+
return '<blockquote>\n'
|
560
|
+
+ body
|
561
|
+
+ '</blockquote>\n';
|
562
|
+
}
|
563
|
+
case 'list_start': {
|
564
|
+
var type = token.ordered ? 'ol' : 'ul'
|
565
|
+
, body = '';
|
566
|
+
|
567
|
+
while (next().type !== 'list_end') {
|
568
|
+
body += tok();
|
569
|
+
}
|
570
|
+
|
571
|
+
return '<'
|
572
|
+
+ type
|
573
|
+
+ '>\n'
|
574
|
+
+ body
|
575
|
+
+ '</'
|
576
|
+
+ type
|
577
|
+
+ '>\n';
|
578
|
+
}
|
579
|
+
case 'list_item_start': {
|
580
|
+
var body = '';
|
581
|
+
|
582
|
+
while (next().type !== 'list_item_end') {
|
583
|
+
body += token.type === 'text'
|
584
|
+
? parseText()
|
585
|
+
: tok();
|
586
|
+
}
|
587
|
+
|
588
|
+
return '<li>'
|
589
|
+
+ body
|
590
|
+
+ '</li>\n';
|
591
|
+
}
|
592
|
+
case 'loose_item_start': {
|
593
|
+
var body = '';
|
594
|
+
|
595
|
+
while (next().type !== 'list_item_end') {
|
596
|
+
body += tok();
|
597
|
+
}
|
598
|
+
|
599
|
+
return '<li>'
|
600
|
+
+ body
|
601
|
+
+ '</li>\n';
|
602
|
+
}
|
603
|
+
case 'html': {
|
604
|
+
return !token.pre && !options.pedantic
|
605
|
+
? inline.lexer(token.text)
|
606
|
+
: token.text;
|
607
|
+
}
|
608
|
+
case 'paragraph': {
|
609
|
+
return '<p>'
|
610
|
+
+ inline.lexer(token.text)
|
611
|
+
+ '</p>\n';
|
612
|
+
}
|
613
|
+
case 'text': {
|
614
|
+
return '<p>'
|
615
|
+
+ parseText()
|
616
|
+
+ '</p>\n';
|
617
|
+
}
|
618
|
+
}
|
619
|
+
}
|
620
|
+
|
621
|
+
function parseText() {
|
622
|
+
var body = token.text
|
623
|
+
, top;
|
624
|
+
|
625
|
+
while ((top = tokens[tokens.length-1])
|
626
|
+
&& top.type === 'text') {
|
627
|
+
body += '\n' + next().text;
|
628
|
+
}
|
629
|
+
|
630
|
+
return inline.lexer(body);
|
631
|
+
}
|
632
|
+
|
633
|
+
function parse(src) {
|
634
|
+
tokens = src.reverse();
|
635
|
+
|
636
|
+
var out = '';
|
637
|
+
while (next()) {
|
638
|
+
out += tok();
|
639
|
+
}
|
640
|
+
|
641
|
+
tokens = null;
|
642
|
+
token = null;
|
643
|
+
|
644
|
+
return out;
|
645
|
+
}
|
646
|
+
|
647
|
+
/**
|
648
|
+
* Helpers
|
649
|
+
*/
|
650
|
+
|
651
|
+
function escape(html, encode) {
|
652
|
+
return html
|
653
|
+
.replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
|
654
|
+
.replace(/</g, '<')
|
655
|
+
.replace(/>/g, '>')
|
656
|
+
.replace(/"/g, '"')
|
657
|
+
.replace(/'/g, ''');
|
658
|
+
}
|
659
|
+
|
660
|
+
function mangle(text) {
|
661
|
+
var out = ''
|
662
|
+
, l = text.length
|
663
|
+
, i = 0
|
664
|
+
, ch;
|
665
|
+
|
666
|
+
for (; i < l; i++) {
|
667
|
+
ch = text.charCodeAt(i);
|
668
|
+
if (Math.random() > 0.5) {
|
669
|
+
ch = 'x' + ch.toString(16);
|
670
|
+
}
|
671
|
+
out += '&#' + ch + ';';
|
672
|
+
}
|
673
|
+
|
674
|
+
return out;
|
675
|
+
}
|
676
|
+
|
677
|
+
function tag() {
|
678
|
+
var tag = '(?!(?:'
|
679
|
+
+ 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
|
680
|
+
+ '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
|
681
|
+
+ '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b';
|
682
|
+
|
683
|
+
return tag;
|
684
|
+
}
|
685
|
+
|
686
|
+
function replace(regex, opt) {
|
687
|
+
regex = regex.source;
|
688
|
+
opt = opt || '';
|
689
|
+
return function self(name, val) {
|
690
|
+
if (!name) return new RegExp(regex, opt);
|
691
|
+
val = val.source || val;
|
692
|
+
val = val.replace(/(^|[^\[])\^/g, '$1');
|
693
|
+
regex = regex.replace(name, val);
|
694
|
+
return self;
|
695
|
+
};
|
696
|
+
}
|
697
|
+
|
698
|
+
function noop() {}
|
699
|
+
noop.exec = noop;
|
700
|
+
|
701
|
+
/**
|
702
|
+
* Marked
|
703
|
+
*/
|
704
|
+
|
705
|
+
function marked(src, opt) {
|
706
|
+
setOptions(opt);
|
707
|
+
return parse(block.lexer(src));
|
708
|
+
}
|
709
|
+
|
710
|
+
/**
|
711
|
+
* Options
|
712
|
+
*/
|
713
|
+
|
714
|
+
var options
|
715
|
+
, defaults;
|
716
|
+
|
717
|
+
function setOptions(opt) {
|
718
|
+
if (!opt) opt = defaults;
|
719
|
+
if (options === opt) return;
|
720
|
+
options = opt;
|
721
|
+
|
722
|
+
if (options.gfm) {
|
723
|
+
block.fences = block.gfm.fences;
|
724
|
+
block.paragraph = block.gfm.paragraph;
|
725
|
+
inline.text = inline.gfm.text;
|
726
|
+
inline.url = inline.gfm.url;
|
727
|
+
} else {
|
728
|
+
block.fences = block.normal.fences;
|
729
|
+
block.paragraph = block.normal.paragraph;
|
730
|
+
inline.text = inline.normal.text;
|
731
|
+
inline.url = inline.normal.url;
|
732
|
+
}
|
733
|
+
|
734
|
+
if (options.pedantic) {
|
735
|
+
inline.em = inline.pedantic.em;
|
736
|
+
inline.strong = inline.pedantic.strong;
|
737
|
+
} else {
|
738
|
+
inline.em = inline.normal.em;
|
739
|
+
inline.strong = inline.normal.strong;
|
740
|
+
}
|
741
|
+
}
|
742
|
+
|
743
|
+
marked.options =
|
744
|
+
marked.setOptions = function(opt) {
|
745
|
+
defaults = opt;
|
746
|
+
setOptions(opt);
|
747
|
+
return marked;
|
748
|
+
};
|
749
|
+
|
750
|
+
marked.setOptions({
|
751
|
+
gfm: true,
|
752
|
+
pedantic: false,
|
753
|
+
sanitize: false,
|
754
|
+
highlight: null
|
755
|
+
});
|
756
|
+
|
757
|
+
/**
|
758
|
+
* Expose
|
759
|
+
*/
|
760
|
+
|
761
|
+
marked.parser = function(src, opt) {
|
762
|
+
setOptions(opt);
|
763
|
+
return parse(src);
|
764
|
+
};
|
765
|
+
|
766
|
+
marked.lexer = function(src, opt) {
|
767
|
+
setOptions(opt);
|
768
|
+
return block.lexer(src);
|
769
|
+
};
|
770
|
+
|
771
|
+
marked.parse = marked;
|
772
|
+
|
773
|
+
if (typeof module !== 'undefined') {
|
774
|
+
module.exports = marked;
|
775
|
+
} else {
|
776
|
+
this.marked = marked;
|
777
|
+
}
|
778
|
+
|
779
|
+
}).call(function() {
|
780
|
+
return this || (typeof window !== 'undefined' ? window : global);
|
781
|
+
}());
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: marked-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- nodanaonlyzuul
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-03 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! 'A gemified verison of the chjj/marked: "A full-featured markdown parser
|
15
|
+
and compiler, written in javascript."'
|
16
|
+
email:
|
17
|
+
- stephen@eastmedia.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- Gemfile
|
24
|
+
- LICENSE
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- lib/marked-rails.rb
|
28
|
+
- lib/marked-rails/engine.rb
|
29
|
+
- lib/marked-rails/version.rb
|
30
|
+
- marked-rails.gemspec
|
31
|
+
- vendor/assets/javascripts/marked.js
|
32
|
+
homepage: https://github.com/eastmedia/marked-rails
|
33
|
+
licenses: []
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
requirements: []
|
51
|
+
rubyforge_project:
|
52
|
+
rubygems_version: 1.8.24
|
53
|
+
signing_key:
|
54
|
+
specification_version: 3
|
55
|
+
summary: A gemified verison of the chjj/marked
|
56
|
+
test_files: []
|