[pmwiki-devel] Regex and recipe philosphy
Rogutės Sparnuotos
rogutes at googlemail.com
Sat Jul 13 02:07:01 CDT 2013
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
More information about the pmwiki-devel
mailing list