blob: aef7731881c21a4b0c785fb2b94066e7b11bcd6c [file] [log] [blame] [view]
# Plugin Architecture
The plugins used operate at various points in a pelican build.
Pelican uses signals at various points. These are documented [here](https://docs.getpelican.com/en/latest/plugins.html#list-of-signals).
At a high level consider the following sequence of events:
1. Pelican Settings. Settings for a Pelican Build are in your Pelican Configuration
These are automatically created according to your `pelicanconf.yaml` into a settings file that would have something like:
```python
PLUGIN_PATHS = ['./theme/plugins']
PLUGINS = ['asfgenid', 'asfrun', 'asfdata', 'gfm', 'asfreader', 'asfcopy']
```
2. Init (initialized). At this point any ASF_DATA is read into a metadata dictionary made available in every page.
- The [asfdata plugin](./asfdata.py) reads an .asfdata.yaml file and creates the metadata dictionary.
```yaml
setup:
data: asfdata.yaml
```
```python
ASF_DATA_YAML = "asfdata.yaml"
ASF_DATA = {
'data': ASF_DATA_YAML,
'metadata': { },
'debug': True
}
```
- The [asfgenid plugin](./asfgenid.py) configures its features.
```yaml
genid:
unsafe: yes
metadata: yes
elements: yes
headings_depth: 4
permalinks: yes
toc_depth: 4
tables: yes
```
```python
ASF_GENID = {
'unsafe': True,
'metadata': True,
'elements': True,
'headings': True,
'permalinks': True,
'toc': True,
'toc_headers': r"h[1-6]",
'debug': False
}
```
- The [asfrun plugin](./asfrun.py) runs shell scripts during initialization
```yaml
setup:
run:
- /bin/bash shell.sh
```
```python
ASF_RUN = [
'/bin/bash shell.sh'
]
```
- The [asfrun plugin](./asfrun.py) also runs shell scripts during finalization
```yaml
setup:
postrun:
- /bin/bash postshell.sh
```
```python
ASF_POSTRUN = [
'/bin/bash postshell.sh'
]
```
3. Readers (readers_init). Two important readers are set at this point. Readers are responsible for transforming page files to html and
providing a metadata dictionary
- GFMReader by the gfm plugin. Transforms GitHub Flavored Markdown(GFM) to HTML.
* .md
* .markdown
* .mkd
* .mdown
- ASFReader by the [asfreader plugin](./asfreader.py). Transforms an [ezt template](https://github.com/gstein/ezt) into GFM and then to HTML.
* .ezmd
4. Content Init (content_object_init). This is signaled after a Reader has processed content.
At this point plugins can review, record, and transform the html content.
- The [asfgenid plugin](./asfgenid.py) performs a number of steps. Some of the steps are optional.
* Metadata transformation by looking up {{ key_expression }} in the page metadata.
* Inventory of existing id attributes.
* Set id and class attributes specified by {#id} and {.class} syntax.
* Assign id to all headings without ids.
* Insert a Table of Contents if a [TOC] tag is present.
5. Finalization (finalized). This is signalled after all content is generated and static files copied.
At this point additional content can be copied and the final output analyzed.
- The [asfcopy plugin](.asfcopy.py) is an example. Here is copies files from the source tree.
It could be modified to copy information in from external sources too.