[dokuwiki] Re: Lists plug-in : PHP 4.4.3 vs. 5.2.1

  • From: "Metz, Bobby" <Bobby.Metz@xxxxxxxxxxxxxxxxxx>
  • To: "dokuwiki@xxxxxxxxxxxxx" <dokuwiki@xxxxxxxxxxxxx>
  • Date: Tue, 21 Jul 2009 17:56:35 -0400

>       Curious if anyone has used the lists plug-in and experienced it killing 
> native lists format support.  I've run this plug-in for a couple of years on 
> server using PHP 4.4.3.  We recently had to move to a new server running 
> 5.2.1, which is the only difference I can find regarding DW install thus far.

Thought I'd post the solution to my own question in case others need this in 
the future.  For reasons unknown, the lists plug-in has issues under PHP 5.2.1 
with the lexer patterns that it uses in its syntax.php file, lines 81, 84, 86 & 
89 to be specific.

Original code:

81:     '\n\x20{2,}[\x2A\x2D]\s*(?=(?s).*?[^\x5C]\x3C\n\n)',
84:     '\n\x20{2,}[\x2A\x2D]\s*(?=(?s).*?[^\x5C]\x3C\n)', PLUGIN_LISTS);
86:     '\n\t+\s*[\x2A\x2D]\s*(?=(?s).*?[^\x5C]\x3C\n\n)',
89:     '\n\t+\s*[\x2A\x2D]\s*(?=(?s).*?[^\x5C]\x3C\n)', PLUGIN_LISTS);

Under PHP 5.2.1 the above will corrupt display of everything after the first 
standard list on a page.  To prevent munging of "std. list" pages replace the 
'\s*' with '\s+'.  I'm not sure what the '(?s)' portion is accomplishing as it 
doesn't seem to affect anything in my tests, so I removed this as well.

New code:

81:     '\n\x20{2,}[\x2A\x2D]\s+(?=.*?[^\x5C]\x3C\n\n)',
84:     '\n\x20{2,}[\x2A\x2D]\s+(?=.*?[^\x5C]\x3C\n)', PLUGIN_LISTS);
86:     '\n\t+\s*[\x2A\x2D]\s+(?=.*?[^\x5C]\x3C\n\n)',
89:     '\n\t+\s*[\x2A\x2D]\s+(?=.*?[^\x5C]\x3C\n)', PLUGIN_LISTS);

I successfully tested the changes against both PHP 5.2.1 and 4.4.3, so it's 
backwards compatible.  It doesn't fix the old problem of mixing list syntax on 
the same page, i.e. when a normal list is followed by a list with multi-line 
items using lists '<' syntax.  In that case you still have to put a terminating 
'<' and blank line after your normal list to prevent the lists plug-in from 
trying to treat the content between the normal list and the actual first lists 
syntax item as a multiline item.

Bobby

Other related posts: