# Schema

- **[families](#family)**
  - [parents](#parents)
  - [children](#children)
  - [parents2](#parents2)
  - [children2](#children2)
  - [house](#house)
  - [families](#families)
  - [date](#date)
  - [city](#city)
- **[people](#person)**
  - [name](#name)
  - [fullname](#fullname)
  - [links](#links)
  - [class](#class)
- **[styles](#styles)**

## Family

> `families` (Family[])<br>
> `families[].families` (Family[])

A list of families. All properties in a Family are optional, but you have to define at least one.

```yaml
families:
  - parents: [Homer, Marge]
    children: [Bart, Lisa, Maggie]
  - parents: [Lisa, Milhouse]
    children: [Zia]
```

A typical family has `parents` and `children`, but only one is required. Every family must have at least one or more of the required properties defined (`parents`, `parents2`, `children`, `children2`).

```yaml
families:
  # Example: no children
  - parents: [Cam, Mitchell]

  # Example: siblings with unknown parents
  - children: [Haley, Luke, Alex]
```

### parents

> `families[].parents` (String[])

A list of parents. This is a list of person ID's. See [Family](#family) for an example.

### children

> `families[].children` (String[])

A list of children. See [Family](#family) for an example.

### parents2

> `families[].parents2` (String[])

A list of parents. Use this to express atypical lineage, such as step-parents or adoptive parents. See [Family](#family) for an example.

```yaml
# Cersei and Jaime are the biological parents.
# Robert is married to Cersei, and acts as the children's father.
- parents: [Cersei, Jaime]
  parents2: [Robert]
  children: [Myrcella, Joffrey]
```

### children2

> `families[].children2` (String[])

A list of children. Use this to express atypical offspring lineage, such as adoptions, illegitimate children or foster siblings. See [parents2](#parents2) for an example.


```yaml
# Jon is the adopted son of Ned and Catelyn.
- parents: [Ned, Catelyn]
  children: [Rob, Rickon, Arya, Sansa]
  children2: [Jon]
```

### house

> `families[].house` (String)

The name of the house. If given, then a box will be drawn around the family and the sub-families inside it.

```yaml
# The [Rob, Talisa] family will be placed inside House Stark.
- house: Stark
  parents: [Ned, Catelyn]
  children: [Rob, Rickon, Arya, Sansa]
  families:
    - parents: [Rob, Talisa]
```

### families

> `families[].families` (Family[])

You can nest families inside other families. See [house](#house) for an example.

### date

The date the family was formed. Acceptable formats
- MM-DD-YYYY
- YYYY

### city

The city the family lives in.

## Person

> `people{}`

Defines metadata for a person. All parameters are optional.

```yaml
# Nope, he's not dead, he's just here as an example ;)
people:
  Ned:
    name: Ned
    fullname: Eddard Stark
    born: 1950
    died: 1966
    picture: ned.jpg
    links: 
      - https://example.org
    class: [deceased]
```

### name

A person's name. If not present, then the person's ID will be used by default.

### fullname

A person's full name. Will be displayed in gray text.

### links

An array of links. Use this to link to a person's Facebook account. If given, their names will be clickable.

### picture

A filename that contains the picture that should be shown next to the person.

### class

A list of classes for styles. These will be applied to nodes. See [styles](#styles) for more information.

## Styles

> `styles{}`

A key-value object with `class` names as keys, and their GraphViz attributes as values. Refer to Graphviz's [attributes documentation](http://graphviz.org/doc/info/attrs.html) for attributes.

```yaml
people:
  Ned:
    class: [deceased]
styles:
  deceased:
    color: red
    penwidth: 0.25
```
