# biisan

[![travis](https://travis-ci.org/tsuyukimakoto/biisan.svg?branch=master)](https://travis-ci.org/tsuyukimakoto/biisan) [![codecov](https://codecov.io/gh/tsuyukimakoto/biisan/branch/master/graph/badge.svg)](https://codecov.io/gh/tsuyukimakoto/biisan) [![Updates](https://pyup.io/repos/github/tsuyukimakoto/biisan/shield.svg)](https://pyup.io/repos/github/tsuyukimakoto/biisan/) [![Python 3](https://pyup.io/repos/github/tsuyukimakoto/biisan/python-3-shield.svg)](https://pyup.io/repos/github/tsuyukimakoto/biisan/)[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)[![codebeat badge](https://codebeat.co/badges/e5a0ad5d-baab-4795-b07d-e03594b477d4)](https://codebeat.co/projects/github-com-tsuyukimakoto-biisan-master)

biisan is a static site generator that can write documents in [reStructuredText](http://docutils.sourceforge.net/rst.html).

## Feature

- Convert the structure of reStructuredText to the structure of object, and output to html with jinja2 template for each [Directives](http://docutils.sourceforge.net/docs/user/rst/cheatsheet.txt) of reStructuredText
- The default template is attached for the directives supported by biisan, but the template to be used can be replaced if the search destination is set in the configuration
- The conversion processor from directive to object can also replace any processor by setting
- The processing of the directive which is not supported is also possible by the same mechanism as replacement.
- Easy definition of new directives
- The process of converting the structure of reStructuredText to an object is performed in parallel in multiprocessing

## quick start

### Installation

It can be installed with pip. Since dependent libraries are also installed at the same time, you may want to create and install a virtual environment using venv if you want to be able to erase them cleanly.

```
$ pip install biisan
```

### Initialize

Generate the basic structure of biisan and configuration file. There is a folder called `biisan_data` under the folder you have run.

Answer `blog title`, `base URL`, `language code` as it is asked. You can change it later in the configuration file.

```
$ python -m biisan.main
? What's your blog title  blog title
? input your blog base url. like https://www.tsuyukimakoto.com  http:localhost
? input your blog language like ja  en

        Always set environment variable BIISAN_SETTINGS_MODULE to biisan_local_settings like bellow.

        $ export BIISAN_SETTINGS_MODULE=biisan_local_settings

```

Finally, the environment variables required whenever using biisan are output. It is an environment variable that is always required when using biisan.

It is a setting framework setting of [glueplate](https://pypi.org/project/glueplate/).

### First Entry

Let's check the contents of the generated folder.

```
$ cd biisan_data
$ tree
.
├── data
│   ├── biisan_local_settings.py
│   ├── blog
│   ├── extra
│   │   └── about.rst
│   └── templates
└── out
```

Inside the `biisan_data` folder there are two folders, `data` and `out`.

- data

    - biisan_local_settings.py

        setting file. It has been added to or overwritten in the [Original file settings](https://github.com/tsuyukimakoto/biisan/blob/master/biisan/biisan_settings.py) settings.

    - blog

        Put the reStructuredText file in this. It is good to make a folder so that it is easy to organize. The folder structure in the blog folder has nothing to do with the path of the output URL.

    - extra

        Put the file if you want to create a separate page from the date based entry. about is set by default.
        When newly added, add the definition of GLUE_PLATE_PLUS_BEFORE_extra to the setting file (data/biisan_local_settings.py).

        For example, if you put the file imusing.rst, define `GLUE_PLATE_PLUS_BEFORE_extra` in `data/biisan_local_settings.py` as follows.

        ```
        # Omitted

        settings = _(
            # 省略
            multiprocess = 8,
            GLUE_PLATE_PLUS_BEFORE_extra = [
                'imusing',
            ],
        )
        ```

        This is how glueplate works, ['imusing' before the `extra` setting in the [original file settings file](https://github.com/tsuyukimakoto/biisan/blob/master/biisan/biisan_settings.py) ',] Is added.

        See also [Actual setting](https://github.com/tsuyukimakoto/tsuyukimakoto.com/blob/master/data/biisan_local_settings.py#L19).

    - templates

        Put the template you want to overwrite. Like `GLUE_PLATE_PLUS_BEFORE_extra`, `GLUE_PLATE_PLUS_BEFORE_template_dirs` is defined in the configuration file, so first we will start looking for template files in this folder.

- out

      Html is output statically in this folder.

### This is the first entry

Let's save as `my_first_entry.rst` in `data/blog` as follows. The file name may be anything before the file extension, as long as the extension is .rst.

```
Is the first entry
=========================================================

:slug: my_first_biisan_entry
:date: 2019-05-05 13:00
:author: Your name

Hello! world!
```

### Build

The operation is done in the `data` directory (in biisan_data/data).

```
$ python -m biisan.generate
```

If you get an error like the following, it is because you have not set the environment variable displayed at the time of initialization.

```
Traceback (most recent call last):
(Omitted)
KeyError: 'BIISAN_SETTINGS_MODULE'
```

If you have not set the environment variable, try setting again and executing the command again.

```
$ export BIISAN_SETTINGS_MODULE=biisan_local_settings
$ python -m biisan.generate
```

If you get the following error, the folder where you are executing the command is wrong. Let's execute it in `biisan_data/data`.

```
Traceback (most recent call last):
(Omitted)
ModuleNotFoundError: No module named 'biisan_local_settings'
```

If it works, the output is as follows, so let's open it in a browser.

```
$ python -m biisan.generate
BIISAN 0.3.0
INFO:__main__:Write:(omitted)/biisan_data/out/blog/2019/05/05/my_first_biisan_entry/index.html
INFO:__main__:Write:(omitted)/biisan_data/out/about/index.html
```

The URL is composed of `date` and `slug` described in the entry. At this point, the data folder and the out folder are as follows.

```
.
├── data
│   ├── __pycache__
│   │   └── biisan_local_settings.cpython-37.pyc
│   ├── biisan_local_settings.py
│   ├── blog
│   │   └── my_first_entry.rst
│   ├── extra
│   │   └── about.rst
│   └── templates
└── out
    ├── about
    │   └── index.html
    ├── api
    │   ├── feed
    │   │   └── index.xml
    │   └── google_sitemaps
    │       └── index.xml
    ├── blog
    │   ├── 2019
    │   │   └── 05
    │   │       ├── 05
    │   │       │   └── my_first_biisan_entry
    │   │       │       └── index.html
    │   │       └── index.html
    │   └── index.html
    └── index.html
```

Although the file name is index.html, it is assumed that it can be omitted by specifying the directory index of the Web server.

For example, `https://www.tsuyukimakoto.com/about/` should be set to return index.html if the file name is omitted.

The entry path is created based on `slug` and `date` described in the entry rst file.

```
:slug: my_first_biisan_entry
:date: 2019-05-05 13:00
```

## template

A template is provided for each directive. Put templates in the templates folder if you want to change the style etc.

[Default template](https://github.com/tsuyukimakoto/biisan/tree/master/biisan/templates) and [real project template](https://github.com/tsuyukimakoto/tsuyukimakoto.com/tree/master/data/templates).

## Deploy

Deploy the contents of out to an appropriate server. Don't forget to specify the directory index.
