From 77a61dd687da2027d6e7ba4c0898e2ae653a6d7d Mon Sep 17 00:00:00 2001 From: Gabriel Wicke Date: Wed, 14 Mar 2012 10:58:11 +0000 Subject: [PATCH] Improve support for {{!}}, and don't produce a pre for indented tables. --- modules/parser/mediawiki.tokenizer.peg.js | 22 ++++++++----- modules/parser/pegTokenizer.pegjs.txt | 40 +++++++++++------------ 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/modules/parser/mediawiki.tokenizer.peg.js b/modules/parser/mediawiki.tokenizer.peg.js index 48efa0855d..9953518b29 100644 --- a/modules/parser/mediawiki.tokenizer.peg.js +++ b/modules/parser/mediawiki.tokenizer.peg.js @@ -109,23 +109,27 @@ PegTokenizer.prototype.inline_breaks = function (input, pos, stops ) { case '=': return stops.onStack( 'equal' ) || ( counters.h && - input.substr( pos + 1, 200) - .match(/[ \t]*[\r\n]/) !== null ) || null; + input.substr( pos + 1, 200) + .match(/[ \t]*[\r\n]/) !== null ) || null; case '|': return counters.pipe || counters.template || ( counters.table && - ( input[pos + 1].match(/[|}]/) !== null || - counters.tableCellArg - ) + ( input[pos + 1].match(/[|}]/) !== null || + counters.tableCellArg + ) ) || null; case '{': // {{!}} pipe templates.. return ( - counters.pipe || - counters.template - ) && input.substr( pos, 5 ) === '{{!}}' - || null; + counters.pipe || + counters.template || + ( counters.table && + ( input.substr(pos, 10) === '{{!}}{{!}}' || + counters.tableCellArg + ) + ) + ) && input.substr( pos, 5 ) === '{{!}}' || null; case "!": return counters.table && input[pos + 1] === "!" || null; diff --git a/modules/parser/pegTokenizer.pegjs.txt b/modules/parser/pegTokenizer.pegjs.txt index 1595a17862..cfc5eb861a 100644 --- a/modules/parser/pegTokenizer.pegjs.txt +++ b/modules/parser/pegTokenizer.pegjs.txt @@ -468,14 +468,15 @@ block_lines */ block_line = h - / & [{}|] tl:table_lines { return tl; } / lists - // tag-only lines should not trigger pre - / st:optionalSpaceToken - bt:(bts:block_tag stl:optionalSpaceToken { return bts.concat(stl) })+ - &eolf { - return st.concat(bt); - } + / st:optionalSpaceToken + r:( & [{}|] tl:table_lines { return tl; } + // tag-only lines should not trigger pre either + / bts:(bt:block_tag stl:optionalSpaceToken { return bt.concat(stl) })+ + &eolf { return bts } + ) { + return st.concat(r); + } / pre_indent / pre @@ -743,7 +744,7 @@ template tplarg = "{{{" name:template_param_text? - params:( ( space / newline )* pipe ( space / newline )* p:template_param { return p })* + params:( ( space / newline )* '|' ( space / newline )* p:template_param { return p })* ( space / newline )* "}}}" { name = flatten( name ); @@ -756,7 +757,7 @@ tplarg template_param = name:template_param_name // Insanity: MW accepts |foo | = bar | as a single param.. - (pipe (space / newline)* &'=')? + ('|' (space / newline)* &'=')? val:( s0:space* "=" @@ -1104,12 +1105,9 @@ nowiki_content } -// The list of HTML5 tags, mainly used for the identification of non-html -// tags. These terminate otherwise tag-eating productions (see list below) in -// order to support potential extension tags: -// * comment -// * pre -// * nowiki +// The list of HTML5 tags, mainly used for the identification of *non*-html +// tags. Non-html tags terminate otherwise tag-eating productions (see list +// below) in order to support potential extension tags. html5_tagnames = "a" / "abbr" / "address" / "area" / "article" / "aside" / "audio" / "b" / "base" / "bdi" / "bdo" / "blockquote" @@ -1363,7 +1361,7 @@ table_line / table_end_tag table_start_tag - = "{|" + = "{" pipe ta:generic_attribute* space* te:table_end_tag? // can occur somewhere in the middle of the line too @@ -1377,7 +1375,7 @@ table_start_tag } table_caption_tag - = "|+" + = pipe "+" c:inline* { return [ new TagTk( 'caption' )] .concat( c, [ new EndTagTk( 'caption' ) ]); @@ -1386,11 +1384,11 @@ table_caption_tag table_row_tag = //& { console.warn("table row enter"); return true; } - "|-" + pipe "-" a:generic_attribute* space* // handle tables with missing table cells after a row - td:( s:sol ![|!] tdt:table_data_tag { return s.concat(tdt); } )? + td:( s:sol !( pipe / [!] ) tdt:table_data_tag { return s.concat(tdt); } )? { // We rely on our tree builder to close the row as needed. This is // needed to support building tables from fragment templates with @@ -1406,7 +1404,7 @@ table_row_tag table_data_tags = pipe td:table_data_tag - tds:( "||" tdt:table_data_tag { return tdt } )* { + tds:( pipe pipe tdt:table_data_tag { return tdt } )* { return td.concat(tds); } @@ -1446,7 +1444,7 @@ table_heading_tag } table_end_tag - = "|}" { + = pipe "}" { var tok = [new EndTagTk( 'table' )]; return tok; }