fix: adding in standard build

This commit is contained in:
D. Moonfire 2022-10-13 08:53:17 -05:00
parent 2b5c7123e9
commit 4e45f554b4
20 changed files with 4341 additions and 7498 deletions

36
.woodpecker.yml Normal file
View file

@ -0,0 +1,36 @@
clone:
git:
image: woodpeckerci/plugin-git
settings:
tags: true
pipeline:
build:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/build.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: [push, pull_request, tag]
tag: v*
release:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/release.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: push
branch: main

View file

@ -4,22 +4,401 @@
"character": {
"pov": 37,
"name": "Linsan",
"character_slug": "linsan",
"color": "hsl(8, 50%, 50%)"
},
"source": {
"pov": 37,
"volume": 0,
"title": "Allegro",
"status": "unstable",
"genres": ["Action", "Adventure"],
"word_count": 108904,
"length": "Novel",
"title_slug": "allegro",
"identifier_slug": "0037-00-allegro",
"copyright_year": 2023,
"status": "Unstable",
"genres": [
"Action",
"Adventure"
],
"languages": {
"lorban": true
},
"has_dedication": true,
"git": {
"http_url": "https://gitlab.com/fedran/allegro.git",
"branch": "master"
"http_url": "https://src.mfgames.com/fedran-sources/allegro.git",
"branch": "main"
},
"links": {
"development": {
"git": "https://gitlab.com/fedran/allegro"
"git": "https://src.mfgames.com/fedran-sources/allegro/",
"issues": "https://src.mfgames.com/fedran-sources/allegro/issues"
}
}
},
"cover": {
"cover_slug": "0037-00-allegro",
"title_page_lines": [
"Allegro"
]
},
"warnings": {
"text": "This novel contains no scenes of sexual assault."
},
"chapters": [
{
"title": "Always Moving",
"word_count": 983,
"summary": "While Linsan waits for her mother to come home, she bounces around on the furniture and talks to her father. She announces that she has named a violin her father is making Palisis and learns that the violin is for her father's first wife who got married to her mother's best friend.\n",
"teaser": "Linsan is impatiently waiting for her mother to come back. As she does, she bounces around the furniture and teases her father.\n"
},
{
"title": "Early Lessons",
"word_count": 2376,
"summary": "Years later, Linsan is learning how to play the violin from her father. The lesson is interrupted when Dukan, her father's best friend and manager for the business, visits in a panic to tell him that the family's workshop in the valley is on fire.\n",
"teaser": "Years later, Linsan is learning how to play the violin from her father. At least, until there was an interruption.\n"
},
{
"title": "Home Early",
"word_count": 2969,
"summary": "Unable to visit the burnt remains of the family's workshop, Linsan comes home to find her father work in depression. He had given up working on instruments and switched to writing articles about music. She goes into the attic to put some books away and finds Palisis in a corner, returned after Marin's death. She plays it, but then finds out that no one had ever played it before.\n",
"teaser": "Unable to visit the burnt remains of the family's workshop, Linsan comes home to find her father work in depression.\n"
},
{
"title": "Solace in Memories",
"word_count": 4868,
"summary": "As Linsan frequently did, she visited the family's ruins after school. The spot gave her peace despite everything they had lost. However, a bully from school, Dukan's daughter Brook, follows after her and they fight. During the brawl, they both manifest their powers: Linsan with music and Brook with concussion powers.\n",
"teaser": "As Linsan frequently did, she visited the family's ruins after school. The spot gave her peace despite everything they had lost. However, a bully from school, Dukan's daughter Brook, shows up.\n"
},
{
"title": "Bitter Partings",
"word_count": 2616,
"summary": "Linsan comes limping home after her fight with Brook. Her parents are surprised she is there, but then Dukan and Brook show up. Dukan has his daughter apologizes and then offers to send money to the Sterlig's. Linsan's father tries to refuse it, but Dukan phrases it as helping Linsan and they accept.\n",
"teaser": "Bruised and aching from her fight, the last thing Linsan wanted to do was meet up was Brook and her father, but they were waiting by the time she limped home.\n"
},
{
"title": "Revelations",
"word_count": 2082,
"summary": "Linsan and her mother are having a picnic the family's valley. They dance and play music. After that, Linsan finds out that her family is struggling with money because her father's new jobs don't pay well and her mother can't get roles for plays.\n",
"teaser": "Years later, Linsan is enjoying a picnic with her mother in the family's valley. However things aren't going as well as she thought and Linsan is left with some uncomfortable questions.\n"
},
{
"title": "Decisions",
"word_count": 745,
"summary": "On the day after her eighteenth birthday, Linsan realizes that her parents were losing money every day. She comes to the decision to ask for money from Dukan, though she wasn't going to tell either her mother or father about her choice.\n",
"teaser": "On the day after her eighteenth birthday, Linsan realizes that her parents were losing money every day. She comes to the decision to ask for money from Dukan.\n"
},
{
"title": "Questions",
"word_count": 3923,
"summary": "Linsan sneaks out of the house early on her eighteenth birthday to ask Dunkan for more money. But before she can talk to him, Brook stops her and they argue. Three men pass them two women as they are fighting, then later the bank explodes. Brook rushes into the burning building to fight the three men.\n",
"teaser": "After hours of walking across town, Linsan finally has her chance to ask Dukan for more money or a job. She doesn't know what he is going to say or demand, but she's willing to pay almost any price.\n"
},
{
"title": "Burn Damage",
"word_count": 2171,
"summary": "After the fight, Brook and Linsan are asked by the investigating guards to identify a body found. Linsan identifies the corpse as her father based on a few pieces of evidence, but otherwise she can't. Linsan finds out that Palisis was missing and appears to have been stolen.\n",
"teaser": "After the bank burned down, there is one macabre task left for Linsan and Brook, to identify the body the guards found in the vault.\n"
},
{
"title": "Hard Questions",
"word_count": 3174,
"summary": "Kamel, the fire investigator, goes with Linsan to ask questions about Palisis. Sian and Tisin reveal a lot more about their relationship with Dukan and Marin. They also show how dire their finances and why.\n",
"teaser": "Kamel, the fire investigator, visits Linsan and her family with some hard questions about Duncan's death. But the questions continue further, into more intimate question that would expose hidden secrets.\n"
},
{
"title": "Do Anything",
"word_count": 1447,
"summary": "Linsan is struggling with depression and despair with her inability to join the fight at the bank. Her mother talks to her, giving lessons from her plays. As they do, Linsan decides to follow after the murderers to find them and then report them to guards.\n",
"teaser": "Devastated by grief and sorrow, Linsan felt helpless. However, a simple comment gives her a path forward, one that would help assay her guilt and find Palisis.\n"
},
{
"title": "Sneaking Out",
"word_count": 2509,
"summary": "Linsan tries to sneak out of the house but her parents catch her. They reveal that they realized what she was doing and had gotten her supplies for her trip, including an old Sterlig violin and a modified violin case.\n",
"teaser": "Linsan is ready to start her hunt for Duncan's murderers and the thieves who stole Palisis from her family. The only thing left is to sneak out of her house and get on the road. Just a few steps and she'll be gone.\n"
},
{
"title": "The Next Step",
"word_count": 692,
"summary": "Linsan is out on her own for the first time. The initial excitement fades quickly as she reaches the furthest she had walked from the house. But then she realizes she had to keep going and pushes herself to taking another step.\n",
"teaser": "Linsan is on an adventure or is she on a mission? Either way, she is about to do something terrifying and she isn't sure she is entirely ready.\n"
},
{
"title": "An Empty Room",
"word_count": 1296,
"summary": "At the end of her first day, Linsan was no longer excited about finding the murderers. It was, however, her first time in a strange village. She had the money to pay for it, but how long would that last.\n",
"teaser": "At the end of her first day, Linsan was no longer excited about finding the murderers.\n"
},
{
"title": "High at Night",
"word_count": 908,
"summary": "At the end of her first night singing and dancing under her own skills, Linsan is excited that it was a success. She had earned her keep with music and magic.\n",
"teaser": "At the end of her first night singing and dancing under her own skills, Linsan is excited that it was a success. She had earned her keep with music and magic.\n"
},
{
"title": "Luck and Wagons",
"word_count": 728,
"summary": "In the morning, Linsan gets back on the road but the slow pace of her walking quickly frustrates her. Fortunately, an opportunity presents itself.\n",
"teaser": "In the morning, Linsan gets back on the road but the slow pace of her walking quickly frustrates her. Fortunately, an opportunity presents itself.\n"
},
{
"title": "A Glimmer of Hope",
"word_count": 2749,
"summary": "A chance stop in a village gives Linsan hope that she is still on the trail of the murderers.\n",
"teaser": "A chance stop in a village gives Linsan hope that she is still on the trail of the murderers.\n"
},
{
"title": "Whispers in the Night",
"word_count": 600,
"summary": "Because she can't drive the wagon or travel at night, Linsan is forced to wait for Maril sleep before they can get going in the morning.\n",
"teaser": "Forced to wait through the night, Linsan struggles with her fears and frustration of being unable to catch up with the murderers.\n"
},
{
"title": "Prayer",
"word_count": 667,
"summary": "Unable to sleep, Linsan continues to get anxious. Maril suggests praying. It has never worked with Linsan, but the effort helps.\n",
"teaser": "Unable to sleep, Linsan continues to get anxious. Maril suggests praying.\n"
},
{
"title": "New Brunil",
"word_count": 2115,
"summary": "Linsan investigates New Brunil after getting a list of mechanics. At the first one she visits, she encounters a group of men trying to rob Brook. Together, they fight the robbers and run away.\n",
"teaser": "Linsan finally reaches a New Brunil, a town large enough to have mechanics. All she has to do is go through a list of possible mechanics and find one that may have serviced the murderer's cars.\n"
},
{
"title": "Separate Ways",
"word_count": 852,
"summary": "Linsan hoped to keep up with Brook, if anything for the company of someone she knew. Brook, on the other hand, had other opinions and hurried along. Linsan can't keep up and has to make a decision to chase after Brook or continue on her list. She decided to continue her search for the murderers.\n",
"teaser": "Linsan hoped to keep up with Brook, if anything for the company of someone she knew. Brook, on the other hand, had other opinions.\n"
},
{
"title": "Disappointment",
"word_count": 2330,
"summary": "Unable to find Brook or signs of the killers, Linsan returns to Maril's wagon and loses herself in dejected feelings. As she is waiting, Brook's car passes and then stops. They have a screaming fight that Maril breaks up. Then Brook drives off. Maril has Linsan wait until Brook returns and then Linsan gets into Brook's car.\n",
"teaser": "Unable to find Brook or signs of the killers, Linsan returns to Maril's wagon and loses herself in dejected feelings.\n"
},
{
"title": "A Mapped Route",
"word_count": 919,
"summary": "Linsan is uncomfortable traveling in a vehicle compared to the wagon. Brook's tension isn't helping. Eventually Brook speaks up and explains how she figured out where the murderers are going, by mapping the car they stole from her father.\n",
"teaser": "Linsan is uncomfortable traveling in a vehicle compared to the wagon. Brook's tension isn't helping.\n"
},
{
"title": "Checking In",
"word_count": 2896,
"summary": "Arriving at a public house, Brook slams on her brakes and throws Linsan into the dash. Before Linsan can recover, she gets out, opens up the trunk, and heads instead. Linsan doesn't know what to do but she notices that Brook's luggage is in the trunk. She guesses she is suppose to bring it inside, so she does but Brook mocks her for not letting the staff. Inside, Brook gets Linsan a room. The bartender assumes they are sleeping together. Brook leaves on her own. Left alone, Linsan notices there are musicians and asks if she can join then. It is amateur night, so she joins and meets up with Ragon and Wendil who encourage her. She plays and dances, impressing almost everyone. At the end, Linsan sees Brook almost join in with the applause, but she stops before activating her concussion powers; she leaves the room upset.\n",
"teaser": "Linsan didn't know what to expect while traveling with Brook. The animosity between the two of them wasn't going to magically go away but even so, she wasn't expecting to be thrown into the dash of the dark without warning.\n"
},
{
"title": "Networking",
"word_count": 3231,
"summary": "Linsan wakes up with a hangover. When she goes down, there are too many people and she is overwhelmed. However, Ragon and Wendil call her over and they get to talking. Ragon reveals he works at the mechanics Linsan and Brook were going to visit and gives some details about the three men the women were hunting.\n",
"teaser": "Linsan's new friends have an unexpected knowledge into the men they are hunting.\n"
},
{
"title": "Planning",
"word_count": 1403,
"summary": "Linsan and Brook drive toward Fanasis Village which is where they plan on taking a detour down to Little Rock and Gabaw's home. Along the way, they talk about their plans when they meet up with the three men. They decide they need to fight, but Brook suggests they stop in the village and practice.\n",
"teaser": "As Linsan and Brook drive toward Fanasis Village, they realize they needed more than enthusiasm if they catch up to the murderers.\n"
},
{
"title": "The Feathered Queen",
"word_count": 1590,
"summary": "While asking villagers about the murderers, Linsan comes up to an old woman living alone who was willing to exchange something Linsan held dear: memories and music.\n",
"teaser": "While asking villagers about the murderers, Linsan comes up to an old woman living alone who was willing to exchange something Linsan held dear: memories and music.\n"
},
{
"title": "Training Day",
"word_count": 4227,
"summary": "Linsan and Brook take time to learn how to fight with each other so they can take on the murderers. They find out that the synergy between their powers creates a far more powerful and deadly force.\n",
"teaser": "Linsan and Brook take time to learn how to fight with each other so they can take on the murderers.\n"
},
{
"title": "Understanding Music",
"word_count": 2314,
"summary": "Exhausted and tired, Linsan and Brook head back to the inn to sleep.\n",
"teaser": "Exhausted and tired, Linsan and Brook head back to the inn to sleep.\n"
},
{
"title": "Rough Driving",
"word_count": 1095,
"summary": "Brook is driving toward Little Rock at a break-neck pace. Despite Linsan's discomfort, Brook is able to keep up. At least until her emotions starts to rise up.\n",
"teaser": "Brook is driving toward Little Rock at a break-neck pace. Despite Linsan's discomfort, Brook is able to keep up. At least until her emotions starts to rise up.\n"
},
{
"title": "One More Question",
"word_count": 2021,
"summary": "Linsan and Brook finally arrived at Little Rock, the home of the murderers. They only have a little time before they confront them and doubt begins to haunt them.\n",
"teaser": "Linsan and Brook finally arrived at Little Rock, the home of the murderers. They only have a little time before they confront them and doubt begins to haunt them.\n"
},
{
"title": "Flame and Song",
"word_count": 3682,
"summary": "Linsan and Brook finally meet up with the murderers. Would they finally be able to bring them to justice?\n",
"teaser": "Linsan and Brook finally meet up with the murderers. Would they finally be able to bring them to justice?\n"
},
{
"title": "Tears",
"word_count": 1369,
"summary": "Linsan recovers from the crash with countless bruises, a snapped violin bow, and snapped strings. Brook, on the other hand, had taken far more damage.\n",
"teaser": "Linsan recovers from the crash with countless bruises, a snapped violin bow, and snapped strings. Brook, on the other hand, had taken far more damage.\n"
},
{
"title": "An Offer of Help",
"word_count": 2168,
"summary": "With their car still stuck in the hole, Linsan and Brook are unsure what to do next. As they wait, a new friend arrives.\n",
"teaser": "With their car still stuck in the hole, Linsan and Brook are unsure what to do next. As they wait, a new friend arrives.\n"
},
{
"title": "Negotiations",
"word_count": 1503,
"summary": "Linsan and Brook return to Fanasis Village with the ruins of her car. The game is still going on, but they need a room for the night.\n",
"teaser": "Linsan and Brook return to Fanasis Village with the ruins of her car. The game is still going on, but they need a room for the night.\n"
},
{
"title": "Waiting",
"word_count": 1080,
"summary": "Linsan waits for Brook to finish bathing so she could have her own turn.\n",
"teaser": "Linsan waits for Brook to finish bathing so she could have her own turn.\n"
},
{
"title": "A Hot Bath",
"word_count": 1542,
"summary": "Linsan finished her hot bath and returns to their room.\n",
"teaser": "Linsan finished her hot bath and returns to their room.\n"
},
{
"title": "The Morning After",
"word_count": 1314,
"summary": "Linsan wakes up as Brook starts to ask questions about their relationship. Unsure since sexual relationships are new to Linsan, they announce they are still friends but they will figure it out as they go.\n",
"teaser": "Linsan wakes up as Brook starts to ask questions about their relationship.\n"
},
{
"title": "Estimation",
"word_count": 1446,
"summary": "Hand-in-hand, Linsan and Brook return to the smithy to find out how much damage was done to the Glasscoaster.\n",
"teaser": "Hand-in-hand, Linsan and Brook return to the smithy to find out how much damage was done to the Glasscoaster.\n"
},
{
"title": "Centuries",
"word_count": 1135,
"summary": "Linsan and Brook talk as Linsan repairs her bow and Brook learns about how much the fire devastated the Sterlig name.\n",
"teaser": "Linsan and Brook talk as Linsan repairs her bow and Brook learns about how much the fire devastated the Sterlig name.\n"
},
{
"title": "Song and Dance",
"word_count": 971,
"summary": "Linsan and Brook learn new songs despite not having a violin.\n",
"teaser": "Linsan and Brook learn new songs despite not having a violin.\n"
},
{
"title": "Overtime",
"word_count": 1666,
"summary": "Linsan and Brook come back from a day of practice to find out that the Coaster isn't going to be ready to leave at midnight like they hoped.\n",
"teaser": "Linsan and Brook come back from a day of practice to find out that the Coaster isn't going to be ready to leave at midnight like they hoped.\n"
},
{
"title": "Repaired",
"word_count": 1856,
"summary": "The Glasscoaster is repaired, but there is an unexpected setback before they could chase after Tabil and the other killers.\n",
"teaser": "The Glasscoaster is repaired, but there is an unexpected setback before they could chase after Tabil and the other killers.\n"
},
{
"title": "Princess",
"word_count": 852,
"summary": "Miska annoys Brook as they head to the next city.\n",
"teaser": "Miska annoys Brook as they head to the next city.\n"
},
{
"title": "Challenge",
"word_count": 2572,
"summary": "While waiting for Miska and Brook, Linsan is challenged by a street busker to play.\n",
"teaser": "While waiting for Miska and Brook, Linsan is challenged by a street busker to play.\n"
},
{
"title": "Pistons",
"word_count": 2138,
"summary": "Miska and Linsan head to the Piston mechanics to see if they could find out any more information.\n",
"teaser": "Miska and Linsan head to the Piston mechanics to see if they could find out any more information.\n"
},
{
"title": "Authorization",
"word_count": 1975,
"summary": "Brook uses her contacts in the bank to get more information about the money transfered to pay for the Black Thunder.\n",
"teaser": "Brook uses her contacts in the bank to get more information about the money transfered to pay for the Black Thunder.\n"
},
{
"title": "Sullen",
"word_count": 973,
"summary": "Brook struggled with the collapse of her life.\n",
"teaser": "Brook struggled with the collapse of her life.\n"
},
{
"title": "Screams",
"word_count": 1472,
"summary": "Lost in despair, Brook drives dangerously fast as the sun sets. Linsan and Miska try to stop her but Brook won't listen to reason.\n",
"teaser": "Lost in despair, Brook drives dangerously fast as the sun sets. Linsan and Miska try to stop her but Brook won't listen to reason.\n"
},
{
"title": "Dancing",
"word_count": 1049,
"summary": "While camping for the night, Miska has an idea.\n",
"teaser": "While camping for the night, Miska has an idea.\n"
},
{
"title": "Denied",
"word_count": 1118,
"summary": "A quick trip for supplies ends up leaving a bitter experience for the three women.\n",
"teaser": "A quick trip for supplies ends up leaving a bitter experience for the three women.\n"
},
{
"title": "Visitors",
"word_count": 1824,
"summary": "They finally arrived at Stone Over Moon Waters with two days to spare. The three women come up with their next steps.\n",
"teaser": "They finally arrived at Stone Over Moon Waters with two days to spare. The three women come up with their next steps.\n"
},
{
"title": "Messages",
"word_count": 674,
"summary": "Linsan gets messages and money from her parents.\n",
"teaser": "Linsan gets messages and money from her parents.\n"
},
{
"title": "New Plans",
"word_count": 917,
"summary": "The three women struggle to come up with a new plan after the surprise announcement.\n",
"teaser": "The three women struggle to come up with a new plan after the surprise announcement.\n"
},
{
"title": "Grand Entrance",
"word_count": 1912,
"summary": "The three enter the auction house and are quickly overwhelmed.\n",
"teaser": "The three enter the auction house and are quickly overwhelmed.\n"
},
{
"title": "Surprises",
"word_count": 2075,
"summary": "Linsan gets separated from Brook and encounters an unexpected surprise.\n",
"teaser": "Linsan gets separated from Brook and encounters an unexpected surprise.\n"
},
{
"title": "Requests",
"word_count": 2571,
"summary": "Linsan and Brook search for Miska who had gone missing.\n",
"teaser": "Linsan and Brook search for Miska who had gone missing.\n"
},
{
"title": "Proof",
"word_count": 3637,
"summary": "Linsan has the opportunity to prove that she has played Palisis before, but there are some disagreements.\n",
"teaser": "Linsan has the opportunity to prove that she has played Palisis before, but there are some disagreements.\n"
},
{
"title": "Decisions",
"word_count": 917,
"summary": "Linsan, Brook, and Miska have to decide what comes next.\n",
"teaser": "Linsan, Brook, and Miska have to decide what comes next.\n"
}
]
}
}
}

View file

@ -1,6 +1,4 @@
{
description = ""Flight of the Scions" is a novel by D. Moonfire.";
inputs = {
nixstable.url = "nixpkgs/21.05";
nixpkgs.url = "nixpkgs/nixos-unstable";

View file

@ -1,5 +0,0 @@
---
title: Credits
---
At the moment, no one named has read this.

13
matter/legal.md Normal file → Executable file
View file

@ -2,7 +2,7 @@
title: Legal
---
Copyright © 2022 D. Moonfire\
Copyright © 2023 D. Moonfire\
Some Rights Reserved\
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
@ -10,10 +10,7 @@ Cover art by D. Moonfire
All characters, events, and locations are fictitious. Any resemblance to persons, past, present, and future is coincidental and highly unlikely.
Some themes that appear in this book: anxiety,
bullying,
death of named characters.
There is no sex or explicit scenes. There is no rape.
This novel contains no scenes of sexual assault.
Broken Typewriter Press\
5001 1st Ave SE\
@ -23,8 +20,8 @@ Cedar Rapids, IA 52402
Broken Typewriter Press\
[https://broken.typewriter.press/](https://broken.typewriter.press/)
{% if edition.isbn %}
ISBN {{ edition.isbn }}
{% if (edition.isbn) %}
ISBN {{edition.isbn}}
{% endif %}
Version {{ edition.version }}
Version {{edition.version}}

2
matter/license.md Normal file → Executable file
View file

@ -27,6 +27,6 @@ The preferred attribution for this novel is:
In the above attribution, use the following links:
- Allegro: [https://fedran.com/allegro/](https://fedran.com/allegro/)
- Flight of the Scions: [https://fedran.com/allegro/](https://fedran.com/allegro/)
- D. Moonfire: https://d.moonfire.us/
- CC BY-NC-SA 4.0: https://creativecommons.org/licenses/by-nc-sa/4.0/

View file

@ -3,7 +3,7 @@ title: Lorban
---
<p>
This novel is set in the Gepaul countryside where the native language is
This novel is set in the Kormar countryside where the native language is
Lorban. This is notionally translated into English, but there are certain
quirks of the language that stand being called out.
</p>

0
matter/title.html Normal file → Executable file
View file

11217
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,15 @@
{
"name": "allegro",
"private": true,
"version": "0.36.0",
"fedran": {
"pov": "0037",
"vol": "00"
"private": true,
"description": "\"Allegro\" is a novel by D. Moonfire.",
"author": {
"name": "D. Moonfire"
},
"description": "A novel by D. Moonfire",
"author": "D. Moonfire",
"license": "CC-BY-NC-SA-4.0",
"repository": {
"type": "git",
"url": "git+https://gitlab.com/fedran/allegro.git"
"url": "git+https://src.mfgames.com/fedran-sources/allegro.git"
},
"homepage": "https://fedran.com/allegro/",
"scripts": {
@ -19,21 +17,9 @@
"build:epub": "mfgames-writing-format build epub",
"build:docx": "mfgames-writing-format build docx",
"build": "run-s build:*",
"prebuild": "npm run format",
"bundle": "tar -cjf $npm_package_name.tar.bz2 *.epub *.pdf",
"prebundle": "npm run build",
"upload": "aws --endpoint-url https://$AWS_ENDPOINT s3 cp --acl public-read $npm_package_name.tar.bz2 s3://$AWS_BUCKET/$npm_package_name.tar.bz2",
"preupload": "npm run bundle",
"test:epubcheck": "epubcheck *.epub",
"prepare": "husky install",
"format": "run-s format:*",
"format:prettier": "prettier . --write --loglevel warn",
"format:nix": "nixfmt flake.nix",
"test": "run-s test:*",
"test:commits": "commitlint-gitlab-ci -x @commitlint/config-conventional"
"prepare": "husky install"
},
"dependencies": {
"@fedran/lint": "^0.1.0",
"@fedran/writing-hyphen": "^1.0.0",
"@fedran/writing-theme": "^4.0.2",
"@mfgames-writing/contracts": "^4.4.0",
@ -44,20 +30,17 @@
"@mfgames-writing/hyphen-pipeline": "^1.0.2",
"@mfgames-writing/liquid-theme": "^2.1.1",
"@mfgames-writing/weasyprint-format": "^5.0.4",
"markdown-it-multimd-table": "^4.2.0"
"markdown-it-multimd-table": "^4.1.3"
},
"devDependencies": {
"@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0",
"@saithodev/semantic-release-gitea": "^2.1.0",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"@semantic-release/gitlab": "^7.0.4",
"@semantic-release/npm": "^8.0.3",
"@semantic-release/release-notes-generator": "^10.0.3",
"commitizen": "^2.10.1",
"commitlint-gitlab-ci": "^0.0.4",
"cz-conventional-changelog": "^2.1.0",
"husky": "^7.0.2",
"markdowny": "^0.2.1",
"npm-run-all": "^4.1.5",

View file

@ -1,11 +1,11 @@
{
"metadata": {
"title": "Allegro",
"title": "{{edition.fedran.source.title}}",
"author": "D. Moonfire",
"language": "en",
"theme": "@fedran/writing-theme",
"outputDirectory": ".",
"outputFilename": "dmoonfire-{{ edition.fedran.identifier }}-{{ edition.name }}-{{ edition.version }}.{{ edition.ext }}",
"outputFilename": "dmoonfire-{{edition.fedran.source.title_slug}}-{{edition.name}}-{{edition.version}}.{{edition.ext}}",
"markdown": {
"extensions": [
{
@ -33,6 +33,7 @@
},
"pdf": {
"format": "@mfgames-writing/weasyprint-format",
"isbn": "",
"images": {
"grayscale": true,
"opaque": true
@ -136,26 +137,6 @@
"element": "appendix",
"id": "license",
"source": "matter/license.md"
},
{
"element": "appendix",
"source": "matter/credits.md",
"pipeline": [
{
"module": "@mfgames-writing/guillemet"
},
{
"module": "@fedran/writing-hyphen"
},
{
"module": "@mfgames-writing/hyphen-pipeline",
"exclude": ["`.*?`", "<code>.*?</code>"]
}
]
},
{
"element": "colophon",
"source": "matter/colophon.md"
}
]
}

View file

@ -25,8 +25,9 @@ module.exports = {
"@semantic-release/git",
[
"@semantic-release/gitlab",
"@saithodev/semantic-release-gitea",
{
giteaUrl: "https://src.mfgames.com",
assets: [
{ path: "*.epub", label: "EPUB2", type: "other" },
{ path: "*.pdf", label: "PDF", type: "other" },

View file

@ -1,13 +1,18 @@
#!/usr/bin/env bash
# Set up logging.
log() { echo "🛠️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Make sure everything is set up.
./scripts/setup.sh
log "setting up project"
./scripts/setup.sh || exit 1
# Build the project.
npm run build
# Build the project outputs.
log "building PDF"
npm run build:pdf || exit 1
# Versions
# 2022-08-11 - Initial version
log "building EPUB"
npm run build:epub || exit 1

View file

@ -3,22 +3,25 @@
# Checks the environment to see if we have all the requisite components needed
# to upload or download from the S3 bucket.
for i in AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_ENDPOINT AWS_BUCKET
# Set up logging.
log() { echo "⚗️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
for i in S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY S3_ENDPOINT S3_BUCKET
do
if [ "x${!i}" = "x" ]
then
echo "$(basename $0): missing environment variable $i"
log "missing environment variable $i"
exit 1
fi
done
if [ ! which s3cmd 2> /dev/null ]
then
echo "$(basename $0): cannot find 's3cmd' to execute"
log "cannot find 's3cmd' to execute"
exit 1
fi
exit 0
# Versions
# 2022-08-11 - Initial version

View file

@ -3,6 +3,9 @@
# Builds the final versions of the book and then upload the results to various
# locations.
# Set up logging.
log() { echo "️🚢 $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
@ -11,19 +14,27 @@ cd $(dirname $(dirname $0))
./scripts/check-env-bucket.sh || exit 1
# Clean up old versions of the file.
log "cleaning up prior versions which may not match versions"
rm -f dmoonfire*
# Perform the release process.
npx semantic-release
log "performing semantic release"
export GIT_CREDENTIALS="dmoonfire:$GITEA_TOKEN"
npx semantic-release || exit 1
# Create a tarball of the output files and upload them to S3.
if ls dmoonfire* &> /dev/null
then
export npm_package_name=$(cat package.json | jq -r .name)
tar -cjf $npm_package_name.tar.bz2 dmoonfire*
s3cmd --access_key=$AWS_ACCESS_KEY_ID --access_token=$AWS_SECRET_ACCESS_KEY --host=$AWS_ENDPOINT --host-bucket=$AWS_ENDPOINT -P put allegro.tar.bz2 s3://$AWS_BUCKET
log "packaging output into a tarball"
tar -cjf allegro.tar.bz2 dmoonfire*
log "uploading tarball to bucket"
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
export AWS_ENDPOINT=$S3_ENDPOINT
export AWS_BUCKET=$S3_BUCKET
s3cmd --access_key=$S3_ACCESS_KEY_ID --access_token=$S3_SECRET_ACCESS_KEY --host=$S3_ENDPOINT --host-bucket=$S3_ENDPOINT -P put allegro.tar.bz2 s3://$S3_BUCKET || exit 1
else
log "no files to upload"
fi
# Versions
# 2022-08-12 Added an if check for files before uploading
# 2022-08-11 - Initial version

View file

@ -3,23 +3,29 @@
# Download the Fedran covers for inclusion. This places everything into the
# ./build/fedran-covers folder.
# Set up logging.
log() { echo "🖼 $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Check to see if it is already downloaded.
if [ -d ./build/fedran-covers ]
then
echo "$(basename $0): fedran-covers already exists, not downloading"
log "fedran-covers already exists, not downloading"
else
# Make sure we have all the required environment variables.
echo "$(basename $0): fedran-covers is missing, download from bucket"
log "fedran-covers is missing, download from bucket"
./scripts/check-env-bucket.sh || exit 1
# Set the variables.
export AWS_ACCESS_KEY_ID=$S3_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=$S3_SECRET_ACCESS_KEY
export AWS_ENDPOINT=$S3_ENDPOINT
export AWS_BUCKET=$S3_BUCKET
# Download and extract the bucket.
mkdir -p ./build/fedran-covers
s3cmd --access_key=$AWS_ACCESS_KEY_ID --access_token=$AWS_SECRET_ACCESS_KEY --host=$AWS_ENDPOINT --host-bucket=$AWS_ENDPOINT -P get s3://$AWS_BUCKET/fedran-covers.tar.bz2 ./build/fedran-covers/fedran-covers.tar.bz2
s3cmd --access_key=$S3_ACCESS_KEY_ID --access_token=$S3_SECRET_ACCESS_KEY --host=$S3_ENDPOINT --host-bucket=$S3_ENDPOINT -P get s3://$S3_BUCKET/fedran-covers.tar.bz2 ./build/fedran-covers/fedran-covers.tar.bz2 || exit 1
tar x -C build/fedran-covers -f build/fedran-covers/fedran-covers.tar.bz2
fi
# Versions
# 2022-08-11 - Initial version

View file

@ -3,17 +3,22 @@
# Sets up the fonts for building the PDF output. It doesn't do it if we are not
# in a CI environment.
# Set up logging.
log() { echo "✒️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
# We only insert the fonts if we are on a CI server.
if [ "x$CI" == "x" ]
then
echo "$(basename $0): not in CI environment, not installing fonts"
log "not in CI environment, not installing fonts"
else
echo "$(basename $0): installing fonts"
log "installing fonts"
mkdir -p ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-serif-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-sans-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
fc-cache
fc-list | grep -i source
fi
# Versions
# 2022-08-11 - Initial version
log "updating font caches"
fc-cache
fi

View file

@ -2,13 +2,16 @@
# Installs the required Node packages
# Set up logging.
log() { echo "📦️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
if [ -d ./node_modules ]
then
echo "$(basename $0): node_modules already exists"
log "node_modules already exists"
else
echo "$(basename $0): setting up node"
log "setting up node"
npm install --ci
fi
# Versions
# 2022-08-11 - Initial version

View file

@ -7,6 +7,3 @@ cd $(dirname $(dirname $0))
./scripts/setup-fonts.sh || exit 1
./scripts/setup-fedran-covers.sh || exit 1
./scripts/setup-node.sh || exit 1
# Versions
# 2022-08-11 - Initial version

0
scripts/test.sh Executable file → Normal file
View file