[pmwiki-users] Pagelist to list $:ptv>1993

Peter Bowers pbowers at pobox.com
Fri Oct 30 10:03:37 CDT 2009


On Fri, Oct 30, 2009 at 3:45 AM, ABClf <languefrancaise at gmail.com> wrote:
> Until now, I can't make first (a) suggestion work (neither yyyy neither
> yyyy-mm)

There may be some way to make it work, but I wasn't 100% sure from the start.

> (c) works and is clearer than mine.

> I'm also in trouble with (b) greateq and numcomp (parse error, unexpected
> T_CASE ; for numcomp).

I went ahead and made the necessary changes, tested it, and documented it at

http://www.pmwiki.org/wiki/Cookbook/ConditionalMarkupSamples#ifnumcomp

> *Does anyone know how to extract the first 4 signs from a ptv, as in :
> Date : 1896, 1932, 1966
...
> (:pagelist trail=Argot.BibliographieDesDictionnaires fmt=#titredate {(substr
> {=$:Date} 0 4)}=199[3-9],20[0-9][0-9] count=10:)

Unfortunately you can't use markup expressions within conditionals
like that.  It's the order of rules.

You could redefine the non-aesthetically-pleasing {pre-if-mx(...)}
with the following:

Markup('{pre-if-mx(', '<if',
  '/\\{pre-if-mx(\\(\\w+\\b.*?\\))\\}/e',
  "MarkupExpression(\$pagename, PSS('$1'))");

and then you get (:if ...:) capabilities, but that still doesn't work
inside a pagelist.

(besides, it's *really* ugly.)

So at the bottom of this email you will find an altered numcomp
condition which only looks at the first 4 characters.  This seems very
awkward to me, but maybe somebody else can come up with a more elegant
solution...

With this definition I was able to successfully test this pagelist:

(:pagelist name=Test.N* $:abc=?* if="numcomp '{=$:abc}' <= 1993":)
and
(:pagelist name=Test.N* $:abc=?* if="numcomp '{=$:abc}' >= 1993":)

Frankly I would probably go with the wildcard solution, but here's a
working alternative if you want it...

(Note that after I did numcomp I found Cookbook/ConditionalExtensions
which has the various comparisons you were looking for...  But
obviously no substr() built in.)

-Peter

$Conditions['numcomp'] = 'NumericCompareArgs($condparm) == 0';
function NumericCompareArgs($arg) {
  $arg = ParseArgs($arg);
  $arg[''][0] = substr(@$arg[''][0], 0, 4);
  $arg[''][2] = substr(@$arg[''][2], 0, 4);
  #echo "args=<pre>".print_r($arg,true)."</pre><br>\n";
  # Would be nice to check $arg[''][1] here using in_array() and give
an error message
  # Would be nice to check for existence and numericalness of [0] and
[2] and error nicely
  switch (@$arg[''][1]) {
     case '&gt;':
     case '>': return !(@$arg[''][0] > @$arg[''][2]);
        break;
     case '&gt;=':
     case '>=': return !(@$arg[''][0] >= @$arg[''][2]);
        break;
     case '&lt;':
     case '<': return !(@$arg[''][0] < @$arg[''][2]);
        break;
     case '&lt;=':
     case '<=': return !(@$arg[''][0] <= @$arg[''][2]);
        break;
     #case '&gt;':
     case '!=': return !(@$arg[''][0] != @$arg[''][2]);
        break;
     #case '&gt;':
     case '==':
     case '=': return !(@$arg[''][0] == @$arg[''][2]);
        break;
     default:
        echo "NumericCompare: ERROR: Unknown operator ".@$arg[''][1]."<br>\n";
        echo "args=<pre>".print_r($arg,true)."</pre><br>\n";
        return !(@$arg[''][0] == @$arg[''][2]);
  }
}



More information about the pmwiki-users mailing list