01127: Add a negation parameter to pagelist first/last templates
Description:
Page list templates don't have an equivalent (:template ...:)
markup for the expression (:if equal {=$Group} {<$Group}:)
, ie. all items except for the first in a group.
There does exist an expression for the first item in a group, (:template first {=$Group}:)
. Obviously its negation should be (:template ! first {=$Group}:)
, which is useful for example in cases where markup needs to be inserted between each item in a pagelist but not at the ends.
The diff below adds such a negation parameter ('!' or '-') for the (:template first/last:)
and for (:template first/last {=$Group}:)
directives.
=================================================================== --- scripts/pagelist.php (revision 2389) +++ scripts/pagelist.php (working copy) @@ -572,16 +572,16 @@ $ttext = preg_replace('/\\[\\[#[A-Za-z][-.:\\w]*\\]\\]/', '', $ttext); ## extract portions of template - $tparts = preg_split('/\\(:(template)\\s+(\\w+)\\s*(.*?):\\)/i', $ttext, -1, - PREG_SPLIT_DELIM_CAPTURE); + $tparts = preg_split('/\\(:(template)\\s+([-!]?)\\s*(\\w+)\\s*(.*?):\\)/i', + $ttext, -1, PREG_SPLIT_DELIM_CAPTURE); ## handle (:template defaults:) $i = 0; while ($i < count($tparts)) { if ($tparts[$i] != 'template') { $i++; continue; } - if ($tparts[$i+1] != 'defaults' && $tparts[$i+1] != 'default') { $i+=4; continue; } - $opt = array_merge(ParseArgs($tparts[$i+2], $PageListArgPattern), $opt); - array_splice($tparts, $i, 3); + if ($tparts[$i+2] != 'defaults' && $tparts[$i+2] != 'default') { $i+=5; continue; } + $opt = array_merge(ParseArgs($tparts[$i+3], $PageListArgPattern), $opt); + array_splice($tparts, $i, 4); } SDVA($opt, array('class' => 'fpltemplate', 'wrap' => 'div')); @@ -620,10 +620,10 @@ while ($t < count($tparts)) { if ($tparts[$t] != 'template') { $item = $tparts[$t]; $t++; } else { - list($when, $control, $item) = array_slice($tparts, $t+1, 3); $t+=4; + list($neg, $when, $control, $item) = array_slice($tparts, $t+1, 4); $t+=5; if (!$control) { - if ($when == 'first' && $i != 0) continue; - if ($when == 'last' && $i != count($matches) - 1) continue; + if ($when == 'first' && ($neg xor ($i != 0))) continue; + if ($when == 'last' && ($neg xor ($i != count($matches) - 1))) continue; } else { if ($when == 'first' || !isset($last[$t])) { $Cursor['<'] = $Cursor['<'] = (string)@$matches[$i-1]; @@ -632,7 +632,8 @@ $curr = str_replace($vk, $vv, $control); $curr = preg_replace('/\\{(=|&[lg]t;)(\\$:?\\w+)\\}/e', "PageVar(\$pn, '$2', '$1')", $curr); - if ($when == 'first' && $i > 0 && $last[$t] == $curr) continue; + if ($when == 'first' && ($neg xor (($i != 0) && ($last[$t] == $curr)))) + { $last[$t] = $curr; continue; } $last[$t] = $curr; } if ($when == 'last') { @@ -642,7 +643,7 @@ $next = str_replace($vk, $vv, $control); $next = preg_replace('/\\{(=|&[lg]t;)(\\$:?\\w+)\\}/e', "PageVar(\$pn, '$2', '$1')", $next); - if ($next == $last[$t] && $i != count($matches) - 1) continue; + if ($neg xor ($next == $last[$t] && $i != count($matches) - 1)) continue; $last[$t] = $next; } }
This looks good and I was about to add it to the core, but then I had a crazy idea. What if we add something like:
(:template 1:)
==(:template first:)
first page(:template >1:)
==(:template ! first:)
(suggested above)(:template >2:)
== third and next ones(:template -1:)
==(:template last:)
last page(:template <-1:)
==(:template ! last:)
(suggested above)
But also
(:template %2:)
== every second page (zebra tables, 2, 4, 6, 8, etc.)(:template %3 {=$Group}:)
== every third page from the group (3, 6, 9, etc.)
This would be quite a change to the script though. I am not sure it is a good idea. There is one benefit of using "1" instead of "first", for international users. Comments welcome. --Petko August 23, 2009, at 09:58 AM
Using numerals instead of words would make sense from a non-english perspective, but the word arguments shouldn't stop working if the change is made. Also, has someone actually asked for this? I mean, isn't this a bit of a case of creeping featurism, and in any case deserving of its own PITS entry if you feel like going forward with this?
For a second point, is there really a need for '>2
' or '%3
'? Zebra tables could indeed be useful, but the more complex options sound a bit unlikely to me. Regarding zebra tables, the (to me) obvious way to express them would be (:template odd:)
and/or (:template even:)
. —Eemeli Aro August 25, 2009, at 03:22 AM
I really like this idea. When balancing up simplicity and complexity I tend to go for ideas that are simply to understand, but add power. I find that it is surprising what innovative uses can be made once such features are available. simon August 23, 2009, at 04:32 PM
Testing...
[[#tpl]] (:template first:) * {$$PageCount}. FIRST item : {=$:Summary} (:template ! first:) * {$$PageCount}. NON FIRST item : {=$:Summary} [[#tplend]] |
(:template ! first:)
|
(:pagelist trail=RecentChanges count=5 fmt=#tpl:) |
|