Hi Thiago - thanks for this. I was unaware that you could pass arguments to an onEvent() method as query string params as well as context params.
Cheers On Thu, 2011-01-06 at 09:46 -0200, Thiago H. de Paula Figueiredo wrote: > Hi, Richard! > > When passing information from JavaScript to a page or component class, I > avoid the the encoding problem by using query parameters (which are > decoded normally instead of using the Tapestry decoder). With the new > @RequestParameter and @ActivationRequestParameter annotations this is even > easier. > > On Thu, 06 Jan 2011 09:37:35 -0200, Richard Hill <r...@su3analytics.com> > wrote: > > > > > Hi Taha, > > > > Thanks for the response. The latter suggestion doesn't work for me, > > these urls are external urls input by the user. I tried the first > > suggestion but it does not work. Not sure exactly what all the issues > > are, but I note that what encodeURIComponent encodes and what Tapestry > > encodes are not consistent (e.g tapestry doesn't encode a ":" whereas > > encodeURIComponent does). Also Tapestry converts a "$" to "$$", and > > Tapestry's hex is lower-case, whereas encodeURIComponent is upper-cased. > > There may be other differences too. > > > > So I have instead ported the tapestry service method > > URLEncoderImpl.encode(String input) to javascript. I haven't tested on a > > huge number of urls, but it seems to work. I have though tested the hex > > encoding against the main pertinent characters (!, &, ?, %, > > ~, ; /, ....) and they seem to all tally. For posterity this is the > > javascript: > > > > > > _SU3.tapestryEncodeUri = function(uri) { > > > > var ENCODED_NULL = "$N"; > > var ENCODED_BLANK = "$B"; > > > > if (uri == null) return ENCODED_NULL; > > if (uri == "") return ENCODED_BLANK; > > > > var dirty = false; > > > > var encodedUri = ""; > > > > var safe = new RegExp(/[a-zA-Z0-9\-_\.:]/); > > > > for (var i = 0; i < uri.length; i++) { > > > > var ch = uri.charAt(i); > > > > if (ch == '$') { > > encodedUri = encodedUri + "$$"; > > dirty = true; > > continue; > > } > > > > if (ch.match(safe)) { > > encodedUri = encodedUri + ch; > > continue; > > } > > > > var encodedCh = _SU3.tapestryEncodeChar(ch); > > > > encodedUri = encodedUri + encodedCh; > > > > dirty = true; > > } > > > > return dirty ? encodedUri : uri; > > > > }; > > > > > > _SU3.tapestryEncodeChar = function(char) { > > > > var chAsInt = char.charCodeAt(0); > > > > var hex = chAsInt.toString(16); > > > > var encodedCh; > > > > if (hex.length == 2) { > > encodedCh = "$00" + hex; > > } else if (hex.length == 3) { > > encodedCh = "$0" + hex; > > } else if (hex.length == 1) { > > encodedCh = "$000" + hex; > > } else { > > encodedCh = "$" + hex; > > } > > > > return encodedCh; > > }; > > > > > > > > Cheers, Richard. > > > > > > > > On Wed, 2011-01-05 at 11:31 +0530, Taha Hafeez wrote: > >> Hi Richard > >> > >> There are two ways of doing it... > >> > >> 1. after you have applied encodeURIComponent() replace '%' by '$00' > >> (ensure > >> that the converted number is 4 digit) > >> 2. Use ?name=value instead of '/' and use request.getParameter() or > >> @RequestParameter > >> > >> regards > >> Taha > >> > >> > >> On Tue, Jan 4, 2011 at 11:26 PM, Richard Hill <r...@su3analytics.com> > >> wrote: > >> > >> > > >> > Ah, apologies - I thought the threading was based on the subject line. > >> > > >> > R. > >> > > >> > > >> > > >> > On Tue, 2011-01-04 at 15:52 -0200, Thiago H. de Paula Figueiredo > >> wrote: > >> > > Hi! > >> > > > >> > > Please post new discussions as new messages instead of replying to > >> > > existing ones. Every threaded visualization of the mailing list > >> will show > >> > > your message in the wrong place. ;) > >> > > > >> > > On Tue, 04 Jan 2011 15:24:28 -0200, Richard Hill > >> <r...@su3analytics.com> > >> > > wrote: > >> > > > >> > > > >> > > > Happy New Year All, > >> > > > > >> > > > I'm attempting to pass an url in an ajax request to an onEvent > >> handler. > >> > > > So I'm making a request like: > >> > > > > >> > > > GET /MyPage.MyComponent:event/http://blah.com/.... > >> > > > > >> > > > MyComponent.java: > >> > > > > >> > > > public StreamResponse onEvent(String url) { > >> > > > .... > >> > > > } > >> > > > > >> > > > > >> > > > The problem is that what's being passed to onEvent() is just > >> "http:" > >> > > > > >> > > > Now I realise that "/" is the context delimiter. However I've > >> tried > >> > > > encoding the url with escape(url), encodeURI(url), and > >> > > > encodeURIComponent(url) (the latter 2 encode the "/") but to no > >> avail - > >> > > > same issue. > >> > > > > >> > > > I also realise that Tapestry employs it's own encoding scheme - > >> do I > >> > > > have to encode in this way? If so, does anyone have some code to > >> > > > implement Tapestry url encoding in javascript? > >> > > > > >> > > > Many thanks, > >> > > > > >> > > > Richard. > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> --------------------------------------------------------------------- > >> > > > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > >> > > > For additional commands, e-mail: users-h...@tapestry.apache.org > >> > > > > >> > > > >> > > > >> > > >> > > >> > > >> > --------------------------------------------------------------------- > >> > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > >> > For additional commands, e-mail: users-h...@tapestry.apache.org > >> > > >> > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > > For additional commands, e-mail: users-h...@tapestry.apache.org > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org