User:Jiangxin/Patch Blankline As List Terminator
Description
[edit]|
Bug 1115 described the annoyance of the current implement(1.5.2) of list. Bug 1581: pre over multiple lines in lists (duplicate of 1518) is another problem. Though I have fixed it with User:Jiangxin/Patch Indent Pre, I find out these two annoyance can be fixed with a single solution. |
Bug 1115 详细描述了当前 list 实现(1.5.2) 的不方便之处, 并建议以遇到空行或者下一个 list 时终止当前 list。 Bug 1581: pre over multiple lines in lists (duplicate of 1518) 是另外的一个问题, 虽然我已经用补丁: User:Jiangxin/Patch Indent Pre 修复了这个问题,但是我发现这两个问题可以有一个共同的解决方案。 |
|
| |
<nowiki> #item 1 blah blah blah... ##item 1-1 \ continued blah blah blah... ##item 1-2 <pre> pre text of item 1.2 above is a blank line # in pre block * in pre block
blah blah blah... another paragraph. </nowiki> | |
|
|
|
another paragraph. |
blah blah blah...
continued blah blah blah...
pre text of item 1.2 above is a blank line # in pre block * in pre block
blah blah blah... another paragraph. |
Solution
[edit]
--- mediawiki-1-5-2/includes/Parser.php 2005-11-17 13:46:01.484375000 +0800
+++ mediawiki/includes/Parser.php 2005-11-17 13:48:07.937500000 +0800
@@ -1684,7 +1684,7 @@
if ( !$linestart ) {
$output .= array_shift( $textLines );
}
- foreach ( $textLines as $oLine ) {
+ for($i=0; $oLine = $textLines[$i], $i < count($textLines); $i++) {
$lastPrefixLength = strlen( $lastPrefix );
$preCloseMatch = preg_match('/<\\/pre/i', $oLine );
$preOpenMatch = preg_match('/<pre/i', $oLine );
@@ -1693,6 +1693,54 @@
$prefixLength = strspn( $oLine, '*#:;' );
$pref = substr( $oLine, 0, $prefixLength );
+ # Bugfix 1115, 1581(3989): Newline as list item terminator is troublesome, by JiangXin (http://www.worldhello.net).
+ if ( $prefixLength > 0 ) {
+ $firstline = true;
+ $in_pre = false;
+ for($i++; $oLine2 = $textLines[$i], $i < count($textLines); $i++) {
+
+ if( !empty($preOpenMatch) && empty($preCloseMatch) ) {
+ $in_pre = true;
+ }
+ else if( !empty($preCloseMatch) ) {
+ $in_pre = false;
+ }
+
+ if ($in_pre) {
+ $firstline = false;
+ $oLine .= "\n" . $oLine2;
+ }
+ else if( preg_match('/^([\*#:;].*|^[\\s]*)$/', $oLine2) ) {
+ $i--;
+ break;
+ }
+ else
+ {
+ if( $firstline )
+ {
+ if( !preg_match('/[\\\]$/', $oLine) )
+ {
+ $firstline = false;
+ $oLine .= "<br>\n" . $oLine2;
+ }
+ else
+ {
+ $oLine = rtrim($oLine, "\\");
+ $oLine .= "\n" . $oLine2;
+ }
+ }
+ else
+ {
+ $oLine .= "\n" . $oLine2;
+ }
+ }
+ $preOpenMatch = preg_match('/<pre/i', $oLine2 );
+ $preCloseMatch = preg_match('/<\\/pre/i', $oLine2 );
+ }
+ $preOpenMatch = false;
+ $preCloseMatch = false;
+ }
+
# eh?
$pref2 = str_replace( ';', ':', $pref );
$t = substr( $oLine, $prefixLength );
-- Jiangxin 06:49, 17 November 2005 (UTC)
Test cases in ParserTests.txt
[edit]add several test cases in ParserTests.txt
<nowiki> !! test indent <pre> block test !! input #indent <pre> block :<pre> test.
- item2
test.
- item3
!! result
- indent <pre> block
test.
- item2
test.
- item3
!! end
!! test
indent
block test 2 !! input #item1 ##item1.1 ##:<pre> pre format content here
- item1.2
- item2
- item2.1
- intent content
- item2.2
- item2.1
!! result
- item1
- item1.1
pre format content here
- item1.2
- item1.1
- item2
- item2.1
- intent content
- item2.2
- item2.1
!! end
!! test
indent
block test 3 !! input #item1 ##item1.1 ##:<pre> pre format content here !! result <ol><li>item1 <ol><li>item1.1 <dl><dd><pre> pre format content here
!! end
!! test Bug 1115: Newline as list item terminator is troublesome !! input
- item 1
blah blah blah...
- item 1-1 \
continued blah blah blah...
- item 1-2
pre text of item 1.2 above is a blank line # in pre block * in pre block
- item 2
blah blah blah...
another paragraph. !! result
- item 1
blah blah blah...- item 1-1
continued
blah blah blah... - item 1-2
pre text of item 1.2 above is a blank line # in pre block * in pre block
- item 1-1
continued
- item 2
blah blah blah...
another paragraph.
!! end </nowiki>