# Slides

Slides in `lookatme` are:

> - Separated by hrule elements: `---` in Markdown

> - Resized to fit the current window

## Metadata

Slide metadata is contained within an optional YAML header:

    ---
    title: TITLE
    author: AUTHOR
    date: 2019-12-02
    extensions: []
    styles: {}
    ---

Additional, unknown metadata fields are allowed at the top level. However, the `styles` field and subfields are strictly validated.

### Extensions

Extensions are lookatme contrib modules that redefine lookatme behavior. E.g., the `lookatmecontrib.calendar` example in the examples folder redefines the `render_code` function found in `lookatme/render/markdown_block.py`.

The original `render_code` function gives contrib extensions first-chance at handling any function calls. Contrib extensions are able to ignore function calls, and thus allow the default `lookatme` behavior, by raising the `IgnoredByContrib` exception:

    import datetime
    import calendar
    import urwid

    from lookatme.exceptions import IgnoredByContrib

    def render_code(token, body, stack, loop):
        lang = token["lang"] or ""
        if lang != "calendar":
            raise IgnoredByContrib()

        today = datetime.datetime.utcnow()
        return urwid.Text(calendar.month(today.year, today.month))

### Styles

In addition to the `--style` and `--theme` CLI options for lookatme, the slide metadata may explicitly override styling behaviors within lookatme:

    ---
    title: TITLE
    author: AUTHOR
    date: 2019-12-02
    styles:
      style: monokai
      table:
        column_spacing: 3
        header_divider: "-"
    ---

    # Slide 1

    text

The final, resolved styling settings that will be used when displaying a markdown source is viewable by adding the `--dump-styles` flag as a command-line argument.

See the Default Style Settings for a full list of available, overrideable styles.