# Foldsite Foldsite is a dynamic site generator built with Python and Flask. It allows you to create and manage a website using Markdown content, HTML templates, and CSS styles. ## Table of Contents - [Foldsite](#foldsite) - [Table of Contents](#table-of-contents) - [Configuration](#configuration) - [Template Setup](#template-setup) - [Site Setup](#site-setup) - [Style Setup](#style-setup) - [Template and Style Search](#template-and-style-search) - [How a Template is Written](#how-a-template-is-written) - [Jinja Primer](#jinja-primer) - [Added Tools for the Template](#added-tools-for-the-template) - [Tool Input and Return Types](#tool-input-and-return-types) - [`get_sibling_content_files(path: str) -> list`](#get_sibling_content_filespath-str---list) - [`get_text_document_preview(path: str) -> str`](#get_text_document_previewpath-str---str) - [`get_sibling_content_folders(path: str) -> list`](#get_sibling_content_folderspath-str---list) - [`get_folder_contents(path: str) -> list`](#get_folder_contentspath-str---list) - [Example Usages for Tools and Types](#example-usages-for-tools-and-types) - [Example Usage of `get_sibling_content_files`](#example-usage-of-get_sibling_content_files) - [Example Usage of `get_text_document_preview`](#example-usage-of-get_text_document_preview) - [Example Usage of `get_sibling_content_folders`](#example-usage-of-get_sibling_content_folders) - [Example Usage of `get_folder_contents`](#example-usage-of-get_folder_contents) - [Deployment](#deployment) - [Docker Compose Example](#docker-compose-example) ## Configuration The configuration file is written in TOML format and contains various settings for the application. Below is an example configuration file (`config.toml`): ```toml [paths] content_dir = "example/content" templates_dir = "templates" styles_dir = "styles" [server] listen_address = "127.0.0.1" listen_port = 8080 debug = false access_log = true max_threads = 4 admin_browser = false admin_password = "your_admin_password" ``` ## Template Setup Templates are HTML files that define the structure of your web pages. They are stored in the `templates` directory. Each template can include other templates and use Jinja2 syntax for dynamic content. ## Site Setup The site content is stored in the `content` directory. Each Markdown file represents a page on your site. The directory structure of the `content` directory determines the URL structure of your site. ## Style Setup Styles are CSS files that define the appearance of your web pages. They are stored in the `styles` directory. You can create specific styles for different types of content and categories. ## Template and Style Search Templates and styles are searched in a specific order to apply the most specific styles first, followed by more general styles, and finally the base style. ## How a Template is Written Templates are written in HTML and use Jinja2 syntax for dynamic content. Below is an example template (`base.html`): ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_for('static', filename='base.css') }}"> {% for style in styles %} <link rel="stylesheet" href="{{ style }}"> {% endfor %} </head> <body> <div class="content"> {{ content }} </div> </body> </html> ``` ## Jinja Primer Jinja2 is a templating engine for Python. It allows you to include dynamic content in your HTML templates. Below are some basic Jinja2 syntax examples: - Variables: `{{ variable }}` - Loops: `{% for item in list %} ... {% endfor %}` - Conditionals: `{% if condition %} ... {% endif %}` - Includes: `{% include 'template.html' %}` ## Added Tools for the Template Foldsite provides additional tools for templates, such as functions to get sibling content files, text document previews, and folder contents. ## Tool Input and Return Types ### `get_sibling_content_files(path: str) -> list` Returns a list of sibling content files in the specified directory. ### `get_text_document_preview(path: str) -> str` Generates a preview of the text document located at the given path. ### `get_sibling_content_folders(path: str) -> list` Returns a list of sibling content folders within a specified directory. ### `get_folder_contents(path: str) -> list` Retrieves the contents of a folder and returns a list of `TemplateFile` objects. ## Example Usages for Tools and Types ### Example Usage of `get_sibling_content_files` ```html <ul> {% for file in get_sibling_content_files('path/to/directory') %} <li>{{ file[0] }} - {{ file[1] }}</li> {% endfor %} </ul> ``` ### Example Usage of `get_text_document_preview` ```html <div> {{ get_text_document_preview('path/to/document.md') }} </div> ``` ### Example Usage of `get_sibling_content_folders` ```html <ul> {% for folder in get_sibling_content_folders('path/to/directory') %} <li>{{ folder[0] }} - {{ folder[1] }}</li> {% endfor %} </ul> ``` ### Example Usage of `get_folder_contents` ```html <ul> {% for item in get_folder_contents('path/to/directory') %} <li>{{ item.name }} - {{ item.path }}</li> {% endfor %} </ul> ``` ## Deployment To deploy Foldsite, you can use Docker. Below is an example Dockerfile: ```dockerfile FROM python:3.13.2-bookworm WORKDIR /app COPY requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "main.py"] ``` ## Docker Compose Example Below is an example `docker-compose.yml` file to deploy Foldsite using Docker Compose: ```yaml version: '3.8' services: foldsite: build: . ports: - "8080:8080" volumes: - .:/app environment: - CONFIG_PATH=config.toml ```