Skip to content

Commit

Permalink
Started templates. Went way too long without committing. Had to switc…
Browse files Browse the repository at this point in the history
…h to Java regular expressions because the ColdFusion version doesn't support backreferences within a match.
  • Loading branch information
pmcelhaney committed May 28, 2010
1 parent 1d6870c commit 78fd007
Show file tree
Hide file tree
Showing 2 changed files with 167 additions and 25 deletions.
102 changes: 79 additions & 23 deletions CFStache.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,61 @@

<cffunction name="render">
<cfargument name="template"/>
<cfargument name="context" />
<cfargument name="context" />
<cfset template = renderSections(template, context) />
<cfreturn renderTags(template, context)/>
</cffunction>

<cffunction name="renderSections">
<cfargument name="template" />
<cfargument name="context" />
<cfset var tag = ""/>
<cfset var tagName = ""/>
<cfset var matches = reFindNoCaseValues("{{(\w+)}}", template) />
<cfset var tagName = ""/>
<cfset var type = "" />
<cfset var inner = "" />
<cfset var re = ".*?(\{\{(##)(\w+)}}(.*?)\{\{/\w+\}\}).*" />
<cfset matches = ReFindNoCaseValues(template, re) />
<cfset variables.context = arguments.context />
<cfloop condition = "arraylen(matches) eq 5" >
<cfset tag = matches[2]/>
<cfset type = matches[3] />
<cfset tagName = matches[4] />
<cfset inner = matches[5] />
<cfset template = replace(template, tag, "")/>
<cfset matches = ReFindNoCaseValues(template, re) />

</cfloop>
<cfreturn template/>
</cffunction>

<cffunction name="renderTags">
<cfargument name="template"/>
<cfargument name="context" />
<cfset var tag = ""/>
<cfset var tagName = ""/>
<cfset var re = ".*?(\{\{(!)?(\w+)\}\}).*" />
<cfset var matches = ReFindNoCaseValues(template, re) />

<cfset variables.context = arguments.context />
<cfloop condition = "arraylen(matches) gt 0" >
<cfset tag = matches[1]/>
<cfset tagName = matches[2] />
<cfset template = replace(template, tag, get(tagName))/>
<cfset matches = reFindNoCaseValues("{{(\w+)}}", template) />
<cfloop condition = "arraylen(matches) eq 4" >
<cfset tag = matches[2]/>
<cfset type = matches[3] />
<cfset tagName = matches[4] />
<cfset template = replace(template, tag, renderTag(type, tagName))/>
<cfset matches = ReFindNoCaseValues(template, re) />
</cfloop>
<cfreturn template/>
</cffunction>
<cfreturn template/>
</cffunction>

<cffunction name="renderTag">
<cfargument name="type" />
<cfargument name="tagName" />
<cfif type eq "!">
<cfreturn "" />
<cfelse>
<cfreturn get(tagName) & type />
</cfif>
</cffunction>

<cffunction name="get">
<cfargument name="key" />
Expand All @@ -29,19 +71,33 @@
<cfreturn "" />
</cfif>
</cffunction>

<cffunction
name="ReFindNoCaseValues"
access="private"
returntype="array"
output="false"
hint="Returns the captrued groups for each pattern match.">
<!--- Based on Ben Nadel's code http://bennadel.com/blog/1040-REMatchGroups-ColdFusion-User-Defined-Function.htm --->
<cfargument name="Text"/>
<cfargument name="re"/>
<cfset var results = arrayNew(1) />
<cfset var pattern = CreateObject("java","java.util.regex.Pattern").compile(arguments.re) />
<cfset var matcher = pattern.matcher(arguments.text)/>
<cfset var i = 0 />
<cfset var nextMatch = "" />

<cffunction name="reFindNoCaseValues" access="private">
<cfargument name="re" />
<cfargument name="s"/>
<cfargument name="start" default="1" />
<cfset var matches = reFindNoCase(re, s, 1, true) />
<cfset var i = 0 />
<cfset var result = arrayNew(1) />
<cfloop index="i" from="1" to="#arrayLen(matches.pos)#">
<cfif matches.pos[i] gt 0>
<cfset arrayAppend(result, mid(s, matches.pos[i], matches.len[i])) />
</cfif>
</cfloop>
<cfreturn result />
<cfif matcher.Find()>
<cfloop index="i" from="0" to="#matcher.groupCount()#">
<cfset nextMatch = matcher.group(i) />
<cfif isDefined('nextMatch')>
<cfset arrayAppend(results, nextMatch) />
<cfelse>
<cfset arrayAppend(results, "") />
</cfif>
</cfloop>
</cfif>

<cfreturn results />
</cffunction>
</cfcomponent>
90 changes: 88 additions & 2 deletions Tests.cfc
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

<cffunction name="setup">
<cfset stache = createObject("component", "CFStache").init()/>

</cffunction>


<cffunction name="tearDown">
<!--- <cfset debug(stache.reFindNoCaseValues("\{\{(!)?(\w+)\}\}", template))/> --->
<cfset assertEquals(expected, stache.render(template, context)) />

</cffunction>

<cffunction name="basic">
Expand All @@ -34,12 +35,97 @@
<cfset expected = "I think Jon wants a , right Jon?" />
</cffunction>

<cffunction name="test_render_zero">
<cffunction name="render_zero">
<cfset template = "My value is {{value}}." />
<cfset context = { value = 0 } />
<cfset expected = "My value is 0." />
</cffunction>


<cffunction name="comments">
<cfset template = "What {{!the}} what?" />
<cfset context = structNew() />
<cfset context['!'] = "FAIL" />
<cfset context['the'] = "FAIL" />
<cfset expected = "What what?" />
</cffunction>

<cffunction name="falseSectionsAreHidden">
<cfset template = "Ready {{##set}}set {{/set}}go!" />
<cfset context = { set = false } />
<cfset expected = "Ready go!" />
</cffunction>

<cffunction name="reMatchGroupsTest">
<cfset template = "" />
<cfset expected = "" />

<cfset expectMatches = [ "{{tag}} {{tag}}", "tag", "tag" ] />
<cfset assertEquals(expectMatches, reMatchGroups("{{tag}} {{tag}}", "\{\{(tag)\}\} \{\{(\1)\}\}", "ONE")) />

</cffunction>

<cffunction name="reMatchGroupsTest2">
<cfset template = "" />
<cfset expected = "" />

<cfset expectMatches = [ "{{tag}} {{tag}}", "null", "tag", "tag" ] />
<cfset assertEquals(expectMatches, reMatchGroups("{{tag}} {{tag}}", "\{\{(!)?(tag)\}\} \{\{(\2)\}\}", "ONE")) />

</cffunction>


<cffunction name="reMatchGroupsTest3">
<cfset template = "" />
<cfset expected = "" />

<cfset expectMatches = [ "Hello, {{tag}} and {{person}}!", "null", "tag"] />
<cfset assertEquals(expectMatches, reMatchGroups("Hello, {{tag}} and {{person}}!", ".*?\{\{(!)?(\w+)\}\}.*", "ONE")) />

</cffunction>

<cffunction name="reMatchGroupsTest4">
<cfset template = "" />
<cfset expected = "" />

<cfset expectMatches = [ "Ready {{##set}}set{{/set}}go!", "##", "set", "set"] />
<cfset assertEquals(expectMatches, reMatchGroups("Ready {{##set}}set{{/set}}go!", ".*?\{\{(##)(\w+)}}(.*?)\{\{/\w+\}\}.*", "ONE")) />

</cffunction>






<cffunction
name="REMatchGroups"
access="private"
returntype="array"
output="false"
hint="Returns the captrued groups for each pattern match.">
<!--- Based on Ben Nadel's code http://bennadel.com/blog/1040-REMatchGroups-ColdFusion-User-Defined-Function.htm --->

<cfargument name="Text"/>

<cfargument name="re"/>

<cfset var results = arrayNew(1) />
<cfset var pattern = CreateObject("java","java.util.regex.Pattern").compile(arguments.re) />
<cfset var matcher = pattern.matcher(arguments.text)/>
<cfset var i = 0 />

<cfset matcher.Find()>

<cfset debug(matcher.matches()) />

<cfloop index="i" from="0" to="#matcher.groupCount()#">

<cfset arrayAppend(results, matcher.group(i)) />
</cfloop>

<cfreturn results />
</cffunction>


</cfcomponent>

0 comments on commit 78fd007

Please sign in to comment.