@@ -107,8 +107,8 @@ block.gfm.paragraph = edit(block.paragraph)
107
107
*/
108
108
109
109
block . tables = merge ( { } , block . gfm , {
110
- nptable : / ^ * ( \S .* \| .* ) \n * ( [ - : ] + * \| [ - | : ] * ) \n ( (?: .* \| .* (?: \n | $ ) ) * ) \n * / ,
111
- table : / ^ * \| ( .+ ) \n * \| ( * [ - : ] + [ - | : ] * ) \n ( (?: * \| .* (?: \n | $ ) ) * ) \n * /
110
+ nptable : / ^ * ( [ ^ | \n ] .* \| .* ) \n * ( [ - : ] + * \| [ - | : ] * ) (?: \n ( (?: .* [ ^ > \n ] .* (?: \n | $ ) ) * ) \n * | $ ) / ,
111
+ table : / ^ * \| ( .+ ) \n * \| ? ( * [ - : ] + [ - | : ] * ) (?: \n ( (?: * [ ^ > \n ] .* (?: \n | $ ) ) * ) \n * | $ ) /
112
112
} ) ;
113
113
114
114
/**
@@ -245,34 +245,36 @@ Lexer.prototype.token = function(src, top) {
245
245
246
246
// table no leading pipe (gfm)
247
247
if ( top && ( cap = this . rules . nptable . exec ( src ) ) ) {
248
- src = src . substring ( cap [ 0 ] . length ) ;
249
-
250
248
item = {
251
249
type : 'table' ,
252
250
header : splitCells ( cap [ 1 ] . replace ( / ^ * | * \| * $ / g, '' ) ) ,
253
251
align : cap [ 2 ] . replace ( / ^ * | \| * $ / g, '' ) . split ( / * \| * / ) ,
254
- cells : cap [ 3 ] . replace ( / \n $ / , '' ) . split ( '\n' )
252
+ cells : cap [ 3 ] ? cap [ 3 ] . replace ( / \n $ / , '' ) . split ( '\n' ) : [ ]
255
253
} ;
256
254
257
- for ( i = 0 ; i < item . align . length ; i ++ ) {
258
- if ( / ^ * - + : * $ / . test ( item . align [ i ] ) ) {
259
- item . align [ i ] = 'right' ;
260
- } else if ( / ^ * : - + : * $ / . test ( item . align [ i ] ) ) {
261
- item . align [ i ] = 'center' ;
262
- } else if ( / ^ * : - + * $ / . test ( item . align [ i ] ) ) {
263
- item . align [ i ] = 'left' ;
264
- } else {
265
- item . align [ i ] = null ;
255
+ if ( item . header . length === item . align . length ) {
256
+ src = src . substring ( cap [ 0 ] . length ) ;
257
+
258
+ for ( i = 0 ; i < item . align . length ; i ++ ) {
259
+ if ( / ^ * - + : * $ / . test ( item . align [ i ] ) ) {
260
+ item . align [ i ] = 'right' ;
261
+ } else if ( / ^ * : - + : * $ / . test ( item . align [ i ] ) ) {
262
+ item . align [ i ] = 'center' ;
263
+ } else if ( / ^ * : - + * $ / . test ( item . align [ i ] ) ) {
264
+ item . align [ i ] = 'left' ;
265
+ } else {
266
+ item . align [ i ] = null ;
267
+ }
266
268
}
267
- }
268
269
269
- for ( i = 0 ; i < item . cells . length ; i ++ ) {
270
- item . cells [ i ] = splitCells ( item . cells [ i ] ) ;
271
- }
270
+ for ( i = 0 ; i < item . cells . length ; i ++ ) {
271
+ item . cells [ i ] = splitCells ( item . cells [ i ] , item . header . length ) ;
272
+ }
272
273
273
- this . tokens . push ( item ) ;
274
+ this . tokens . push ( item ) ;
274
275
275
- continue ;
276
+ continue ;
277
+ }
276
278
}
277
279
278
280
// hr
@@ -412,35 +414,38 @@ Lexer.prototype.token = function(src, top) {
412
414
413
415
// table (gfm)
414
416
if ( top && ( cap = this . rules . table . exec ( src ) ) ) {
415
- src = src . substring ( cap [ 0 ] . length ) ;
416
-
417
417
item = {
418
418
type : 'table' ,
419
419
header : splitCells ( cap [ 1 ] . replace ( / ^ * | * \| * $ / g, '' ) ) ,
420
420
align : cap [ 2 ] . replace ( / ^ * | \| * $ / g, '' ) . split ( / * \| * / ) ,
421
- cells : cap [ 3 ] . replace ( / (?: * \| * ) ? \n $ / , '' ) . split ( '\n' )
421
+ cells : cap [ 3 ] ? cap [ 3 ] . replace ( / (?: * \| * ) ? \n $ / , '' ) . split ( '\n' ) : [ ]
422
422
} ;
423
423
424
- for ( i = 0 ; i < item . align . length ; i ++ ) {
425
- if ( / ^ * - + : * $ / . test ( item . align [ i ] ) ) {
426
- item . align [ i ] = 'right' ;
427
- } else if ( / ^ * : - + : * $ / . test ( item . align [ i ] ) ) {
428
- item . align [ i ] = 'center' ;
429
- } else if ( / ^ * : - + * $ / . test ( item . align [ i ] ) ) {
430
- item . align [ i ] = 'left' ;
431
- } else {
432
- item . align [ i ] = null ;
424
+ if ( item . header . length === item . align . length ) {
425
+ src = src . substring ( cap [ 0 ] . length ) ;
426
+
427
+ for ( i = 0 ; i < item . align . length ; i ++ ) {
428
+ if ( / ^ * - + : * $ / . test ( item . align [ i ] ) ) {
429
+ item . align [ i ] = 'right' ;
430
+ } else if ( / ^ * : - + : * $ / . test ( item . align [ i ] ) ) {
431
+ item . align [ i ] = 'center' ;
432
+ } else if ( / ^ * : - + * $ / . test ( item . align [ i ] ) ) {
433
+ item . align [ i ] = 'left' ;
434
+ } else {
435
+ item . align [ i ] = null ;
436
+ }
433
437
}
434
- }
435
438
436
- for ( i = 0 ; i < item . cells . length ; i ++ ) {
437
- item . cells [ i ] = splitCells (
438
- item . cells [ i ] . replace ( / ^ * \| * | * \| * $ / g, '' ) ) ;
439
- }
439
+ for ( i = 0 ; i < item . cells . length ; i ++ ) {
440
+ item . cells [ i ] = splitCells (
441
+ item . cells [ i ] . replace ( / ^ * \| * | * \| * $ / g, '' ) ,
442
+ item . header . length ) ;
443
+ }
440
444
441
- this . tokens . push ( item ) ;
445
+ this . tokens . push ( item ) ;
442
446
443
- continue ;
447
+ continue ;
448
+ }
444
449
}
445
450
446
451
// lheading
@@ -927,13 +932,13 @@ Renderer.prototype.paragraph = function(text) {
927
932
} ;
928
933
929
934
Renderer . prototype . table = function ( header , body ) {
935
+ if ( body ) body = '<tbody>' + body + '</tbody>' ;
936
+
930
937
return '<table>\n'
931
938
+ '<thead>\n'
932
939
+ header
933
940
+ '</thead>\n'
934
- + '<tbody>\n'
935
941
+ body
936
- + '</tbody>\n'
937
942
+ '</table>\n' ;
938
943
} ;
939
944
@@ -944,7 +949,7 @@ Renderer.prototype.tablerow = function(content) {
944
949
Renderer . prototype . tablecell = function ( content , flags ) {
945
950
var type = flags . header ? 'th' : 'td' ;
946
951
var tag = flags . align
947
- ? '<' + type + ' style="text-align: ' + flags . align + '">'
952
+ ? '<' + type + ' align=" ' + flags . align + '">'
948
953
: '<' + type + '>' ;
949
954
return tag + content + '</' + type + '>\n' ;
950
955
} ;
@@ -1310,10 +1315,16 @@ function merge(obj) {
1310
1315
return obj ;
1311
1316
}
1312
1317
1313
- function splitCells ( tableRow ) {
1318
+ function splitCells ( tableRow , count ) {
1314
1319
var cells = tableRow . replace ( / ( [ ^ \\ ] ) \| / g, '$1 |' ) . split ( / + \| * / ) ,
1315
1320
i = 0 ;
1316
1321
1322
+ if ( cells . length > count ) {
1323
+ cells . splice ( count ) ;
1324
+ } else {
1325
+ while ( cells . length < count ) cells . push ( '' ) ;
1326
+ }
1327
+
1317
1328
for ( ; i < cells . length ; i ++ ) {
1318
1329
cells [ i ] = cells [ i ] . replace ( / \\ \| / g, '|' ) ;
1319
1330
}
0 commit comments