5
5
6
6
; ( function ( ) {
7
7
8
+ /**
9
+ * Options
10
+ */
11
+
12
+ var options ;
13
+
8
14
/**
9
15
* Block-Level Grammar
10
16
*/
@@ -109,13 +115,15 @@ block.token = function(src, tokens, top) {
109
115
cap = cap [ 0 ] . replace ( / ^ { 4 } / gm, '' ) ;
110
116
tokens . push ( {
111
117
type : 'code' ,
112
- text : cap . replace ( / \n + $ / , '' )
118
+ text : ! options . pedantic
119
+ ? cap . replace ( / \n + $ / , '' )
120
+ : cap
113
121
} ) ;
114
122
continue ;
115
123
}
116
124
117
125
// gfm_code
118
- if ( cap = block . gfm_code . exec ( src ) ) {
126
+ if ( options . gfm && ( cap = block . gfm_code . exec ( src ) ) ) {
119
127
src = src . substring ( cap [ 0 ] . length ) ;
120
128
tokens . push ( {
121
129
type : 'code' ,
@@ -159,6 +167,7 @@ block.token = function(src, tokens, top) {
159
167
// blockquote
160
168
if ( cap = block . blockquote . exec ( src ) ) {
161
169
src = src . substring ( cap [ 0 ] . length ) ;
170
+
162
171
tokens . push ( {
163
172
type : 'blockquote_start'
164
173
} ) ;
@@ -173,6 +182,7 @@ block.token = function(src, tokens, top) {
173
182
tokens . push ( {
174
183
type : 'blockquote_end'
175
184
} ) ;
185
+
176
186
continue ;
177
187
}
178
188
@@ -206,7 +216,9 @@ block.token = function(src, tokens, top) {
206
216
// list item contains. Hacky.
207
217
if ( ~ item . indexOf ( '\n ' ) ) {
208
218
space -= item . length ;
209
- item = item . replace ( new RegExp ( '^ {1,' + space + '}' , 'gm' ) , '' ) ;
219
+ item = ! options . pedantic
220
+ ? item . replace ( new RegExp ( '^ {1,' + space + '}' , 'gm' ) , '' )
221
+ : item . replace ( / ^ { 1 , 4 } / gm, '' ) ;
210
222
}
211
223
212
224
// Determine whether item is loose or not.
@@ -299,6 +311,11 @@ var inline = {
299
311
nolink : / ^ ! ? \[ ( (?: \[ [ ^ \] ] * \] | [ ^ \[ \] ] ) * ) \] / ,
300
312
strong : / ^ _ _ ( [ ^ \0 ] + ?) _ _ (? ! _ ) | ^ \* \* ( [ ^ \0 ] + ?) \* \* (? ! \* ) / ,
301
313
em : / ^ \b _ ( (?: _ _ | [ ^ \0 ] ) + ?) _ \b | ^ \* ( (?: \* \* | [ ^ \0 ] ) + ?) \* (? ! \* ) / ,
314
+
315
+ // pedantic strong/em
316
+ p_strong : / ^ _ _ (? = \S ) ( [ ^ \0 ] * ?\S ) _ _ (? ! _ ) | ^ \* \* (? = \S ) ( [ ^ \0 ] * ?\S ) \* \* (? ! \* ) / ,
317
+ p_em : / ^ \b _ (? = \S ) ( [ ^ \0 ] * ?\S ) _ \b | ^ \* (? = \S ) ( [ ^ \0 ] * ?\S ) \* (? ! \* ) / ,
318
+
302
319
code : / ^ ( ` + ) ( [ ^ \0 ] * ?[ ^ ` ] ) \1(? ! ` ) / ,
303
320
br : / ^ { 2 , } \n (? ! \s * $ ) / ,
304
321
text : / ^ [ ^ \0 ] + ?(? = [ \\ < ! \[ _ * ` ] | \w + : \/ \/ | { 2 , } \n | $ ) /
@@ -345,7 +362,7 @@ inline.lexer = function(src) {
345
362
}
346
363
347
364
// gfm_autolink
348
- if ( cap = inline . gfm_autolink . exec ( src ) ) {
365
+ if ( options . gfm && ( cap = inline . gfm_autolink . exec ( src ) ) ) {
349
366
src = src . substring ( cap [ 0 ] . length ) ;
350
367
text = escape ( cap [ 1 ] ) ;
351
368
href = text ;
@@ -360,7 +377,9 @@ inline.lexer = function(src) {
360
377
// tag
361
378
if ( cap = inline . tag . exec ( src ) ) {
362
379
src = src . substring ( cap [ 0 ] . length ) ;
363
- out += cap [ 0 ] ;
380
+ out += options . sanitize
381
+ ? escape ( cap [ 0 ] )
382
+ : cap [ 0 ] ;
364
383
continue ;
365
384
}
366
385
@@ -561,7 +580,7 @@ var tok = function() {
561
580
+ '</li>\n' ;
562
581
}
563
582
case 'html' : {
564
- return ! token . pre
583
+ return ! token . pre && ! options . pedantic
565
584
? inline . lexer ( token . text )
566
585
: token . text ;
567
586
}
@@ -644,13 +663,26 @@ function tag() {
644
663
}
645
664
646
665
/**
647
- * Expose
666
+ * Marked
648
667
*/
649
668
650
- var marked = function ( src ) {
669
+ var marked = function ( src , opt ) {
670
+ options = opt || marked . defaults ;
651
671
return parse ( block . lexer ( src ) ) ;
652
672
} ;
653
673
674
+ marked . defaults = {
675
+ gfm : true ,
676
+ pedantic : false ,
677
+ sanitize : false
678
+ } ;
679
+
680
+ options = marked . defaults ;
681
+
682
+ /**
683
+ * Expose
684
+ */
685
+
654
686
marked . parser = parse ;
655
687
marked . lexer = block . lexer ;
656
688
0 commit comments