Hi, Did you try this built-in function? http://www.pmwiki.org/wiki/Cookbook/ParseArgs
-- -- Rogutės Sparnuotos Simon (2013-07-13 15:39): > This is a question about a regex, and a corollary about the philosophy of > recipe parameters. > > I'm trying to write a directive recipe (see excerpt > below)[1<http://khandallah.wellington.net.nz/pmwiki/pmwiki.php/Main/WikiSandbox> > ] > It seems to me that it makes sense to be relatively strict about the syntax > for the directive. > > It more or less get the parsing of the parameters correct, except for the > backreference of the height|width parameters, where I did not want order to > be important > (in fact other than the first ll | topo50 parameter I'd rather the order > was not important). > > Q: For height|width, when both are supplied I only see one (the last) > returned as a backreference, is this because where there are multiple > matches for a back reference only the last is returned? > (I haven't been able to locate any documentation about this). > > > In looking for an exemplar recipe I observe that > Markup('exemplar', 'directive', > '/\\(:exemplar\s*(.*?)\s*:\\)/ei', > "FmtExemplar(PSS('$1')"); > most directives accept anything within their scope, then use > $arg = ParseArgs($args); > > Then the arguments defined are processed, and any unexpected arguments are > disregarded. > > So my corollary question is: > Is this good practice, or just expedient, given the difficulty (as I > perceive it) of defining a parameter list in regex? > > tia > > Simon > > > > > > > > > ## Add a custom markup > # (:nztopo ll=-41.293722,174.871482 :) > # (:nztopo topo50=BP33912708,BP33876687 height=300 width=400 pin=1:) > # arguments are > # ll= or topo50= -- latitude,longitude or topo50 map grid coordinates > # height= -- image height in pixels > # width= -- image width in pixels > # pin= -- show pin > Markup( 'NZTopo', > 'directives', "/\\(:nztopo > ((?:ll=[-+]?\d{1,2}[.]\d+[,][-+]?[1]?\d{1,2}[.]\d+)|(?:topo50=[ABC][A-Z][0-4]\d{7}[,][ABC][A-Z][0-4]\d{7}))\s*((?:height|width)=\d+\s*){0,2}(pin=[01])?\s*:\\)/ei", > "Keep(NZTopo_Parse(PSS('$1'), PSS('$2'), PSS('$3'), PSS('$4'), > PSS('$5')))" ); > # s = dot matches all chars including newline > # e = backreference substitution by expression > # i = case insensitive > # m = multiline > # uses lazy evaluation, preserves leading and trailing white space > # Keep prevents PmWiki markup being applied > # > /** Main NZTopo parser > * /param arguements as documented above > * /return The HTML-formatted NZTopo markup wrapped in a <div> of class > "nztopo", see http://www.topomap.co.nz/. > */ > function NZTopo_Parse($coords, $height, $width, $pin, $p5) { > > > > > Useful references: > http://www.pmwiki.org/wiki/PmWiki/CustomMarkup > http://www.pmwiki.org/wiki/PmWiki/CustomMarkupAlt _______________________________________________ pmwiki-devel mailing list pmwiki-devel@pmichaud.com http://www.pmichaud.com/mailman/listinfo/pmwiki-devel