Hi Simon, Funny you should be doing that, I was just looking at Template the other day and thinking I might suggest a rewrite for 1.7 or 2.0.
When I did a similar thing in Java a few years back, I made it heavy on the initialization and light on evaluation -- since the point of a template is to be reused. The idea was to turn the template string into an array of literal segments and replacement segments on init, e.g. "Hello #{username}, welcome to #{sitename}!" becomes: Literal: "Hello " Replace: 'username' Literal: ", welcome to " Replace: 'sitename' Literal: "!" Then evaluating the template is just running through the array; roughly (http://pastie.org/596449): var result, n, l, sub; l = segments.length; result = new Array(l); for (n = 0; n < l; ++n) { segment = segments[n]; if (typeof segment == 'string') { result[n] = segment; } else { sub = /* ...get substitution ... */ result[n] = sub; } } return result.join(''); Your current code for #evaluate could readily be recast as the #initialize piece. Granted this may be slightly larger (because we need to add the loop above), but it should (subject to testing) be faster. It also lends itself to future enhancement, such as having formatting syntax, since that cost is front-loaded. I've already proposed the first, trivial, formatter for a common use case -- a flag indicating we should escape HTML tags when subbing: http://github.com/tjcrowder/prototype/commit/29b76e7a9e9c6168d62f1d1c6da9aafb1bf5086f FWIW, -- T.J. Crowder tj / crowder software / com On Aug 26, 12:28 am, Samuel Lebeau <samuel.leb...@gmail.com> wrote: > Hi, > > I've been working on a Template rewrite trying to reduce code size and > complexity. > It uses `String#replace` instead of `String#gsub` and thus performs > better. > Do you guys see any enhancements (in terms of performance or code > size) that could be made ? > > Diff:http://github.com/samleb/prototype/commit/8ba0a0b80c5ad230cec32e76636... > File:http://github.com/samleb/prototype/blob/8ba0a0b80c5ad230cec32e766360e... > > Best, > Samuel. > > On 12 août 09, at 20:37, Allen wrote: > > > > > > > Sorry, misunderstood what you were asking. I thought you meant why > > can't the values be populated into the string at initialization. > > > On Aug 12, 2:32 pm, Yaffle <vic99...@yandex.ru> wrote: > >> String#interpolate uses Template#evaluate. > >> This Template realization makes some actions in constructor of > >> Template class instead of Template#evaluate. > >> So if you will use Template#evaluate many times for one Template > >> object, you will save a little time. > > >> On Aug 12, 6:41 pm, Allen <bla...@gmail.com> wrote: > > >>> You should use Strings interpolate function for this. A template is > >>> meant to be reused many times with many different filler values. > > >>> On Jun 14, 10:41 am, Yaffle <vic99...@yandex.ru> wrote: > > >>>> var Template = Class.create({ > >>>> initialize: function(template, pattern){ > >>>> var parts = template.toString().split(pattern || > >>>> Template.Pattern), > >>>> pl = parts.length, > >>>> pattern2 = /^([^.\[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; > > >>>> for(var i=1,k=1;i<pl;i+=4){ > >>>> var before = parts[i] || '', > >>>> escaped = parts[i+1]; > >>>> if(before=='\\'){ > >>>> parts[k-1] += escaped; > >>>> }else{ > >>>> parts[k-1] += before; > > >>>> var propList = [], > >>>> expr = parts[i+2], > >>>> match = pattern2.exec(expr); > >>>> while(match){ > >>>> propList.push( match[1].startsWith('[') ? > >>>> match[2].replace(/\ > >>>> \\\\]/g, ']') : match[1] ); > >>>> if(!match[3]){ > >>>> break; > >>>> } > >>>> expr = expr.substring('[' == match[3] ? match[1].length : > >>>> match[0].length); > >>>> match = pattern2.exec(expr); > >>>> } > > >>>> if(propList.length){ > >>>> parts[k] = propList; > >>>> parts[k+1] = parts[i+3]; > >>>> k+=2; > >>>> }else{ > >>>> parts[k-1] += parts[i+3]; > >>>> } > > >>>> } > >>>> } > >>>> parts.length = k; > >>>> this.parts = parts; > >>>> }, > >>>> evaluate: function(object){ > >>>> if(Object.isFunction(object.toTemplateReplacements)){ > >>>> object = object.toTemplateReplacements(); > >>>> } > >>>> object = object || ''; > > >>>> var r = this.parts[0]; > >>>> for(var i=1,pl=this.parts.length;i<pl;i+=2){ > >>>> var propList = this.parts[i], > >>>> ctx = object; > >>>> for(var j=0,l = propList.length;j<l && ctx;j++){ > >>>> ctx = ctx[propList[j]]; > >>>> } > >>>> r+= String.interpret(ctx)+this.parts[i+1]; > >>>> } > >>>> return r; > >>>> }}); > > >>>> Template.Pattern = /(^|.|\r|\n)(#\{([^\}]*)\})/; --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Prototype: Core" group. To post to this group, send email to prototype-core@googlegroups.com To unsubscribe from this group, send email to prototype-core-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/prototype-core?hl=en -~----------~----~----~----~------~----~------~--~---