palpatine 0.1.0
Tags: cpp, opensource, tutorial, showdev
Published: 2022-09-18 22:57:49

## What is palpatine?
[palpatine](https://github.com/batunpc/palpatine) is a minimal static site generator (SSG) built with [CMake](https://cmake.org/) and written in C++17. It is a command line tool that takes a directory of raw data and generates a static website. It is designed to be fast, simple, and easy to use.
Palpatine is also my favorite villain, the most powerful Sith Lord ever from Star Wars. 

## How to use it?
After cloning the repository from [github](https://github.com/batunpc/palpatine), you can build the project with CMake. If you don't have experience using CMake, don't worry, all you need to do is to run `make prepare` in the root directory of the project. This will run the prepare directive from the Makefile in the project and generate the executable file `palpatine` in the `build/app` directory. You can then run the executable file with `./palpatine` to see the usage of the tool. Examine the [Makefile](https://github.com/batunpc/palpatine/blob/main/Makefile) to see what happens in the background. 
> Note: Currently, palpatine only supports txt file as input but soon it will support markdown.

Demonstration of how to use palpatine 
```bash
# Clone this repository
$ git clone https://github.com/batunpc/palpatine

# Go into the repository
$ cd palpatine

# Build project w/ CMake and install dependencies 
$ make prepare

# Run the script
$ ./palpatine -i <input> -o <output> -s <stylesheet>
```

### Flags
| Flag | Description | Required / Optional |
| --- | --- | --- |
| `-i` | Specify raw data directory or file e.g. use `data` directory in the codebase | Required |
| `-o` | Specify the particular directory that you want to generate static sites to. | Optional |
| `-s` | If you please, you can add custom stylesheets by specifying the css files.<br> By default it uses [bahunya](https://hakanalpay.com/bahunya/)| Optional|
| `-h` | This will display all the available options | Optional |


### Dependencies
The following dependencies will be installed in the `external` directory:
- [p-ranav/argparse](https://github.com/p-ranav/argparse) - A single-file header-only C++11 library for parsing command line arguments.
- [ikalnytskyi/termcolor](https://github.com/ikalnytskyi/termcolor) - A header-only C++ library for printing colored messages to a terminal.

## Features
 
- [x] Generate a static site from a directory of text files
- [x] Generate a stylesheet file for the static site
- [x] Option to change the output directory
- [x] Option to include a custom stylesheet link
- [x] Generate a list of all pages in a directory, with links to each page
- [x] Parse page title from the first line of the file if given


### How to use external libraries in CMake?
Here is a demonstration of how I used in `palpatine` [GitSubModules](https://www.git-scm.com/docs/gitsubmodules) 

- i. Use this below command convenient to add external libraries to your project as a submodule. The below library is one of the libraries I used in `palpatine`. You can use any library you want.
 ```bash
 git submodule add https://github.com/p-ranav/argparse external/argparse
 ```
- ii. Then create cmake folder in your project. `mkdir cmake` (we will add CMake functions)
- iii. Create AddGitSubmodule.cmake file in the cmake folder. 
- iv. Then add the following code to the AddGitSubmodule.cmake file:
 ```cmake
 function(add_git_submodule dirname)
 find_package(Git REQUIRED)

 if(NOT EXISTS ${dirname}/CMakeLists.txt)
 execute_process(COMMAND ${GIT_EXECUTABLE}
 submodule update --init --recursive -- ${dirname}
 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
 )
 endif()

 add_subdirectory(${dirname})
 endfunction()
 ```
- v. In the `root CMakeLists.txt` file, add the following code to finally call the function we have written above:
 ```cmake
 include(cmake/AddGitSubmodule.cmake)
 add_git_submodule(external/argparse) # add any library you want
 ```

- vi. We can link this external library we finally have added with our executable. Navigate to your app CMakeLists.txt file and add the following code:
 ```cmake
 target_link_libraries(${EXECUTABLE_NAME} PUBLIC argparse)
 ```