Code Monkey home page Code Monkey logo

scriptmaker's Introduction

Scriptmaker

A PDF writer for Blood on the Clocktower scripts.

Scriptmaker includes some special features:

  • support for modern and legacy base3+experimental custom scripts
  • homebrew character support via the official app's character schema
    • as a result, supports translations too!
  • nightorder styles: single-sided rotated, or double-sided full-text
  • i18n support with fallback rendering modes

Significant credit goes to chizmw for inspiration and assets!

Stack

  • Python
  • poetry
  • jinja2

Examples

Trouble Brewing

Here's scriptmaker's default output for the official Trouble Brewing script.

You can also choose to generate simple nightorders.

Custom script & homebrew

Homebrewed content and custom logos are also supported.

Usage

Installation

Scriptmaker requires the following non-Python dependencies:

ghostscript
poppler-utils
pango

Install the package with your package manager of choice.

pip install scriptmaker
poetry add scriptmaker
...

Using the CLI

scriptmaker (make-pdf | tokenize)
scriptmaker make-pdf <inputs> [output] [options]

  inputs:
    (--script path/to/script.json | --url https://script.json | --recurse path/to/folder/) # Sources a script.
    [--nights path/to/nights.json] # Supplies a custom night order.
  
  output:
    [--output-folder path/to/folder/] # Creates build/ and pdf/ folders under this directory.
  
  options:
    [--full] # Creates a full-text two-sided nightorder
    [--simple] # Creates a simple, rotatable nightorder for physical printing
    [--i18n-fallback] # Tries to resolve issues with non-Latin character rendering
    [--postprocess] # Compresses PDFs and generates PNGs for pages
scriptmaker tokenize <inputs> [output] [options]

  inputs:
    directory # Recurses over it, adds all scripts to a datastore, and prints the result.
  
  output:
    [--output-folder path/to/folder/] # Creates build/ and pdf/ folders under this directory.
  
  options:
    [--character-size size-in-mm] # Determines the size in millimetres of character tokens; default 45.
    [--reminder-size size-in-mm] # Determines the size in millimetres of reminder tokens; default 19.
    [--extra-copies path/to/copies.json] # A key-value dict of character IDs and token counts, if you wish to generate extra copies.
    [--official-only | --exclude-official] # Either only print base3 + experimental tokens, or don't add them at all (good for homebrews).
    [--postprocess] # Compresses PDFs and generates PNGs for pages

Using the package

  1. Import everything you need.
from scriptmaker import Character, Datastore, Script, PDFTools, Renderer, ScriptmakerError
  1. Create a data store for your new script.
# Create a datastore (leaving it blank uses a temporary directory)
my_datastore : Datastore = Datastore("my/output/directory/")

# Load the official characters into it, if you want
my_datastore.add_official_characters()
  1. Load a script.json file.
with open("my/script.json", "r") as json_file:
    my_script_json = json.load(json_file)

# Perhaps you have a custom nightorder.
with open("my/nightorder.json", "r") as nightorder_file:
    my_nightorder = json.load(nightorder_file)

# Loads the characters into the datastore, then builds a script object too
my_script : Script = my_datastore.load_script(my_script_json, nightorder_json = my_nightorder)
  1. Set your desired options on the script if not already in the script.json.
# Metas are automatically set if there was a _meta block in the script.json
my_script.meta.author = "rsarvar1a"
my_script.meta.add_logo("https://my/logo/url.png")

# Options have defaults; see ScriptOptions()
my_script.options.i18n_fallback = True
  1. Render it!
outputs = set()

# Renders to the datastore path, if no output_folder is given
outputs.add(Renderer().render_script(my_script), output_folder = None)
outputs.add(Renderer().render_nightorder(my_script))
  1. Postprocess your PDFs.
for path in outputs:
  PDFTools.compress(path)
  PDFTools.pngify(path)

scriptmaker's People

Contributors

rsarvar1a avatar

Stargazers

phillyCHEEEEEZ avatar  avatar  avatar Stefan Lenders avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.