<commit_before>### Using mm-repeater
`mm-repeater` allows the duplication of a set of fields contained within a template tag.

```html
<mm-repeater id="myRepeater">
	<template preserve-content>
		<mm-input name="first_name" placeholder="<NAME>"></mm-input>
		<mm-input name="last_name" placeholder="<NAME>"></mm-input>
		<mm-input name="address" placeholder="Address"></mm-input>
		<mm-input name="city" placeholder="City"></mm-input>
		<mm-dropdown name="state" placeholder="State/Province">
			...
		</mm-dropdown>
		<mm-input name="zip_code" placeholder="ZIP/Postal Code"></mm-input>
	</template>
</mm-repeater>
```

#### Validation
Like `mm-form`, `mm-repeater` takes a `config` object, which can take `validation` as a `string` or a custom validation method taking the arguments `value, row:Object, domref:HTMLElement`, and an `errorMessage`. If a custom validation method is used, `this.errorMessage` can be set dynamically.

```javascript
var myRepeater = document.getElementById('myRepeater'),
	Validator = StrandLib.Validator;
myRepeater.config = {
	'first_name': {
		validation: 'alpha'
	},
	'last_name': {
		validation: 'alpha'
	},
	'address': {
		validation: function(value) {
			var a = value.split(" "),
				street_num = parseInt(a[0]),
				street_name = a[1];
			return street_num != NaN;
		},
	},
	'city': {
		validation: 'alpha'
	},
	'zip_code': {
		validation: function(zip) {
			var z = zip.replace('-','');
			return parseInt(z) != NaN && (z.length == 5 || z.length == 9);
		},
		errorMessage: 'Not a valid ZIP'
	}
}
```

#### Getting data from `mm-repeater`
User data from repeated form fields are accessible through the `value` property on the `mm-repeater` element. `value` is a getter/setter interface for the `data` property—this ensures Polymer's data binding updates properly. Each object in the `value` array corresponds to a single repeater row, with key-value pairs corresponding to the name-value pairs of the form elements.

Data can be preloaded into the repeater by setting the `value`. This is useful in views where the end user wishes to edit some pre-existing data.
```javascript
var myRepeater = document.getElementById('myRepeater');
myRepeater.value = [
	{
		first_name: "Jerry",
		last_name: "Seinfeld",
		address: "2880 Broadway",
		city: "New York",
		state: "NY",
		zip_code: "10025"
	},
	{
		first_name: "George",
		last_name: "Costanza",
		address: "2880 Broadway",
		city: "New York",
		state: "NY",
		zip_code: "10025"
	}
];
```
By default, `mm-repeater` initializes the `value` property with an array containing a single, empty `Object`. This results in a single, blank instance of the template being rendered when the form loads.
<commit_msg>cleaned up article headline weighting<commit_after># Using mm-repeater

## Overview

`mm-repeater` allows the duplication of a set of fields contained within a template tag.

```html
<mm-repeater id="myRepeater">
	<template preserve-content>
		<mm-input name="first_name" placeholder="First Name"></mm-input>
		<mm-input name="last_name" placeholder="Last Name"></mm-input>
		<mm-input name="address" placeholder="Address"></mm-input>
		<mm-input name="city" placeholder="City"></mm-input>
		<mm-dropdown name="state" placeholder="State/Province">
			...
		</mm-dropdown>
		<mm-input name="zip_code" placeholder="ZIP/Postal Code"></mm-input>
	</template>
</mm-repeater>
```

## Validation
Like `mm-form`, `mm-repeater` takes a `config` object, which can take `validation` as a `string` or a custom validation method taking the arguments `value, row:Object, domref:HTMLElement`, and an `errorMessage`. If a custom validation method is used, `this.errorMessage` can be set dynamically.

```javascript
var myRepeater = document.getElementById('myRepeater'),
	Validator = StrandLib.Validator;
myRepeater.config = {
	'first_name': {
		validation: 'alpha'
	},
	'last_name': {
		validation: 'alpha'
	},
	'address': {
		validation: function(value) {
			var a = value.split(" "),
				street_num = parseInt(a[0]),
				street_name = a[1];
			return street_num != NaN;
		},
	},
	'city': {
		validation: 'alpha'
	},
	'zip_code': {
		validation: function(zip) {
			var z = zip.replace('-','');
			return parseInt(z) != NaN && (z.length == 5 || z.length == 9);
		},
		errorMessage: 'Not a valid ZIP'
	}
}
```

## Getting data from `mm-repeater`
User data from repeated form fields are accessible through the `value` property on the `mm-repeater` element. `value` is a getter/setter interface for the `data` property—this ensures Polymer's data binding updates properly. Each object in the `value` array corresponds to a single repeater row, with key-value pairs corresponding to the name-value pairs of the form elements.

## Getting data into `mm-repeater`

Data can be preloaded into the repeater by setting the `value`. This is useful in views where the end user wishes to edit some pre-existing data.
```javascript
var myRepeater = document.getElementById('myRepeater');
myRepeater.value = [
	{
		first_name: "Jerry",
		last_name: "Seinfeld",
		address: "2880 Broadway",
		city: "New York",
		state: "NY",
		zip_code: "10025"
	},
	{
		first_name: "George",
		last_name: "Costanza",
		address: "2880 Broadway",
		city: "New York",
		state: "NY",
		zip_code: "10025"
	}
];
```
By default, `mm-repeater` initializes the `value` property with an array containing a single, empty `Object`. This results in a single, blank instance of the template being rendered when the form loads.

{'fraction_non_alphanumeric': 0.14123465836233742, 'fraction_numerical': 0.008060084264517311, 'mean_word_length': 4.537525354969574, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3068573', 'n_tokens_mistral': 1877, 'n_tokens_neox': 1737, 'n_words': 573}