# Plugin – lektor-polymorphic-type 0.1

Add polymorphic field type to Lektor

#### Project links

#### GitHub Statistics

#### Meta

Version: 0.1

Author: Jeff Dairiki

#### Tags

field type, and setup-env

View all tags.

## Project Description

# Lektor Polymorphic Type

This plugin adds a new polymorphic lektor field type, `polymorphic`. The determination of the actual type implementation of the field value is deferred until evaluation time.

A motivating use case is to support having a “body” field whose formatting can be switched between, e.g., `markdown`, and `html` (or some other formatted type, such as reStructuredText.)

## Installation

Add lektor-polymorphic-type to your project from command line:

    lektor plugins add lektor-polymorphic-type

See the Lektor plugin documentation for more information.

## How It Works

If the field has a `polymorphic_type` option set, that value is evaluated and the result is interpreted as the name of the final type for the field.

If no `polymorphic_type` option is set for the field, then we look for a field on the current record whose name is name of the current field with “`_type`” appended.

## Examples

### Simple Example

Here is an example model file for a simple page, with a selectable body format:

    # page.ini

    [model]
    name = Page
    label = {{ this.title }}

    [fields.title]
    label = Title
    type = string

    [fields.body]
    label = Body
    type = polymorphic

    [fields.body_type]
    label = Body Type
    type = select
    choices = markdown, html, text
    default = markdown

Here, the value of the `body_type` field on a particular page will determine whether the `body` field is interpreted as being `markdown`, `html` or `text`.

### Contrived Example

Here is a contrived example showing the use of the `polymorphic_type` option:

    # page.ini

    [model]
    name = Page
    label = {{ this.title }}

    [fields.title]
    label = Title
    type = string

    [fields.body]
    label = Body
    type = polymorphic
    polymorphic_type = 'html' if this.body.lstrip().startswith('<') else 'markdown'

In this case, the `body` field will be interpreted as raw HTML if the content of that field starts with a “`<`”, otherwise it will be interpreted as Markdown text.

## Author

Jeff Dairiki dairiki@dairiki.org

## Changelog

### 0.1 — 2021-02-05

No code changes.

Update development status classifier to "stable".

Test under python 3.9. Stop testing under 3.5.

### 0.1b1 — 2020-05-04

Initial release.

## Comments