Added -index special variable.
This commit is contained in:
@@ -387,12 +387,16 @@ public class Mustache
|
|||||||
return; // TODO: configurable behavior on missing values
|
return; // TODO: configurable behavior on missing values
|
||||||
}
|
}
|
||||||
if (value instanceof Iterable<?>) {
|
if (value instanceof Iterable<?>) {
|
||||||
|
value = ((Iterable<?>)value).iterator();
|
||||||
|
}
|
||||||
|
if (value instanceof Iterator<?>) {
|
||||||
Template.Mode mode = null;
|
Template.Mode mode = null;
|
||||||
for (Iterator<?> iter = ((Iterable<?>)value).iterator(); iter.hasNext(); ) {
|
int index = 0;
|
||||||
|
for (Iterator<?> iter = (Iterator<?>)value; iter.hasNext(); ) {
|
||||||
Object elem = iter.next();
|
Object elem = iter.next();
|
||||||
mode = (mode == null) ? Template.Mode.FIRST :
|
mode = (mode == null) ? Template.Mode.FIRST :
|
||||||
(iter.hasNext() ? Template.Mode.OTHER : Template.Mode.LAST);
|
(iter.hasNext() ? Template.Mode.OTHER : Template.Mode.LAST);
|
||||||
executeSegs(tmpl, ctx.nest(elem, mode), out);
|
executeSegs(tmpl, ctx.nest(elem, ++index, mode), out);
|
||||||
}
|
}
|
||||||
} else if (value instanceof Boolean) {
|
} else if (value instanceof Boolean) {
|
||||||
if ((Boolean)value) {
|
if ((Boolean)value) {
|
||||||
@@ -402,18 +406,10 @@ public class Mustache
|
|||||||
for (int ii = 0, ll = Array.getLength(value); ii < ll; ii++) {
|
for (int ii = 0, ll = Array.getLength(value); ii < ll; ii++) {
|
||||||
Template.Mode mode = (ii == 0) ? Template.Mode.FIRST :
|
Template.Mode mode = (ii == 0) ? Template.Mode.FIRST :
|
||||||
((ii == ll-1) ? Template.Mode.LAST : Template.Mode.OTHER);
|
((ii == ll-1) ? Template.Mode.LAST : Template.Mode.OTHER);
|
||||||
executeSegs(tmpl, ctx.nest(Array.get(value, ii), mode), out);
|
executeSegs(tmpl, ctx.nest(Array.get(value, ii), ii+1, mode), out);
|
||||||
}
|
|
||||||
} else if (value instanceof Iterator<?>) {
|
|
||||||
Template.Mode mode = null;
|
|
||||||
for (Iterator<?> iter = (Iterator<?>)value; iter.hasNext(); ) {
|
|
||||||
Object elem = iter.next();
|
|
||||||
mode = (mode == null) ? Template.Mode.FIRST :
|
|
||||||
(iter.hasNext() ? Template.Mode.OTHER : Template.Mode.LAST);
|
|
||||||
executeSegs(tmpl, ctx.nest(elem, mode), out);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
executeSegs(tmpl, ctx.nest(value, Template.Mode.OTHER), out);
|
executeSegs(tmpl, ctx.nest(value, 0, Template.Mode.OTHER), out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class Template
|
|||||||
*/
|
*/
|
||||||
public void execute (Object context, Writer out) throws MustacheException
|
public void execute (Object context, Writer out) throws MustacheException
|
||||||
{
|
{
|
||||||
Context ctx = new Context(context, null, Mode.OTHER);
|
Context ctx = new Context(context, null, 0, Mode.OTHER);
|
||||||
for (Segment seg : _segs) {
|
for (Segment seg : _segs) {
|
||||||
seg.execute(this, ctx, out);
|
seg.execute(this, ctx, out);
|
||||||
}
|
}
|
||||||
@@ -100,6 +100,8 @@ public class Template
|
|||||||
return ctx.mode == Mode.FIRST;
|
return ctx.mode == Mode.FIRST;
|
||||||
} else if (name == LAST_NAME) {
|
} else if (name == LAST_NAME) {
|
||||||
return ctx.mode == Mode.LAST;
|
return ctx.mode == Mode.LAST;
|
||||||
|
} else if (name == INDEX_NAME) {
|
||||||
|
return ctx.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (ctx != null) {
|
while (ctx != null) {
|
||||||
@@ -242,16 +244,18 @@ public class Template
|
|||||||
{
|
{
|
||||||
public final Object data;
|
public final Object data;
|
||||||
public final Context parent;
|
public final Context parent;
|
||||||
|
public final int index;
|
||||||
public final Mode mode;
|
public final Mode mode;
|
||||||
|
|
||||||
public Context (Object data, Context parent, Mode mode) {
|
public Context (Object data, Context parent, int index, Mode mode) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
this.index = index;
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Context nest (Object data, Mode mode) {
|
public Context nest (Object data, int index, Mode mode) {
|
||||||
return new Context(data, this, mode);
|
return new Context(data, this, index, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,4 +313,5 @@ public class Template
|
|||||||
protected static final String THIS_NAME = "this".intern();
|
protected static final String THIS_NAME = "this".intern();
|
||||||
protected static final String FIRST_NAME = "-first".intern();
|
protected static final String FIRST_NAME = "-first".intern();
|
||||||
protected static final String LAST_NAME = "-last".intern();
|
protected static final String LAST_NAME = "-last".intern();
|
||||||
|
protected static final String INDEX_NAME = "-index".intern();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -188,6 +188,11 @@ public class MustacheTest
|
|||||||
context("things", Arrays.asList("foo", "bar", "baz")));
|
context("things", Arrays.asList("foo", "bar", "baz")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test public void testIndex () {
|
||||||
|
test("123", "{{#things}}{{-index}}{{/things}}",
|
||||||
|
context("things", Arrays.asList("foo", "bar", "baz")));
|
||||||
|
}
|
||||||
|
|
||||||
protected void test (String expected, String template, Object ctx)
|
protected void test (String expected, String template, Object ctx)
|
||||||
{
|
{
|
||||||
assertEquals(expected, Mustache.compiler().compile(template).execute(ctx));
|
assertEquals(expected, Mustache.compiler().compile(template).execute(ctx));
|
||||||
|
|||||||
Reference in New Issue
Block a user