From ea3b95e20d7f5cf6f585b622b8bae0bf42f11f1c Mon Sep 17 00:00:00 2001 From: Subramanya Sastry Date: Wed, 6 Sep 2017 17:47:54 -0500 Subject: [PATCH] Fix bug in dl-dt list output generation * An open
(;) should be closed when we encounter a new
(:) char even if it is on a new line that has other nested lists inside. * Tidy was hiding this PHP parser bug by closing a
and opening a
when given this HTML: "
a
  • b
" It generates "
a
  • b
" However, a HTML5 parser like RemexHTML, domino (used by Parsoid), or browsers don't do this fixup. * So, what I thought was a bug in RemexHTML turned out to be a bug in the PHP parser that was being hidden by the use of Tidy. * Added a regression test. Bug: T175099 Change-Id: I6d5b225b82cecf9a43f23837ed8ec359b31aadad --- includes/parser/BlockLevelPass.php | 7 ++++++- tests/parser/parserTests.txt | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php index 599fbf61de..fab9ab7fb1 100644 --- a/includes/parser/BlockLevelPass.php +++ b/includes/parser/BlockLevelPass.php @@ -257,12 +257,17 @@ class BlockLevelPass { $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] ); } + # Close an open
if we have a
(":") starting on this line + if ( $this->DTopen && $commonPrefixLength > 0 && $prefix[$commonPrefixLength - 1] === ':' ) { + $output .= $this->nextItem( ':' ); + } + # Open prefixes where appropriate. if ( $lastPrefix && $prefixLength > $commonPrefixLength ) { $output .= "\n"; } while ( $prefixLength > $commonPrefixLength ) { - $char = substr( $prefix, $commonPrefixLength, 1 ); + $char = $prefix[$commonPrefixLength]; $output .= $this->openList( $char ); if ( ';' === $char ) { diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt index 3f93793263..380fe6f9b6 100644 --- a/tests/parser/parserTests.txt +++ b/tests/parser/parserTests.txt @@ -4332,6 +4332,21 @@ Definition Lists: Mixed Lists: Test 10 !! end +# This is a regression test for T175099 +# html/php+tidy is insufficient since Tidy covers up the bug. +# But once Tidy is replaced with RemexHTML, html/php+tidy is good enough +!! test +Definition Lists: Mixed Lists: Test 11 +!! wikitext +;a +:*b +!! html +
a
+
+
  • b
+ +!! end + # The Parsoid team disagrees with the PHP parser's seemingly-random # rules regarding dd/dt on the next two tests. Parsoid is more # consistent, and recognizes the shared nesting and keeps the @@ -4339,7 +4354,7 @@ Definition Lists: Mixed Lists: Test 10 # (And tidy again converts
to
before 'bar'.) !! test -Definition Lists: Mixed Lists: Test 11 +Definition Lists: Mixed Lists: Test 12 !! wikitext *#*#;*;;foo :bar *#*#;boo :baz -- 2.20.1