fix: adding in standard build
This commit is contained in:
parent
52cc84729e
commit
8b7e75bddf
26 changed files with 17108 additions and 6331 deletions
|
@ -6,12 +6,21 @@ root = true
|
||||||
[*]
|
[*]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_brace_style = K&R
|
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
indent_style = space
|
indent_style = space
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
max_line_length = 120
|
max_line_length = 80
|
||||||
tab_width = 4
|
tab_width = 4
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
curly_bracket_next_line = true
|
|
||||||
|
[*.{js,ts}]
|
||||||
quote_type = double
|
quote_type = double
|
||||||
|
|
||||||
|
[*.yaml]
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
indent_style = space
|
||||||
|
|
||||||
|
[package.json]
|
||||||
|
indent_size = 2
|
||||||
|
tab_width = 2
|
||||||
|
|
2
.envrc
Normal file
2
.envrc
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
export PATH=$PWD/scripts:$PWD/node_modules/.bin:$PATH
|
||||||
|
use flake || use nix
|
18
.gitignore
vendored
18
.gitignore
vendored
|
@ -1,11 +1,13 @@
|
||||||
*~
|
*~
|
||||||
build/
|
|
||||||
tmp/
|
|
||||||
node_modules/
|
node_modules/
|
||||||
|
.direnv/
|
||||||
|
tmp/
|
||||||
|
build/
|
||||||
|
|
||||||
# Output
|
.*-swp
|
||||||
*-*.*.*.epub
|
dmoonfire*.pdf
|
||||||
*-*.*.*.pdf
|
dmoonfire*.docx
|
||||||
*-*.*.*.mobi
|
dmoonfire*.html
|
||||||
*-*.*.*.html
|
dmoonfire*.mobi
|
||||||
*-*.*.*.docx
|
dmoonfire*.epub
|
||||||
|
*.bz2
|
||||||
|
|
17
.prettierignore
Normal file
17
.prettierignore
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
CHANGELOG.md
|
||||||
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
archives/
|
||||||
|
build/
|
||||||
|
extras/
|
||||||
|
others/
|
||||||
|
node_modules/
|
||||||
|
submissions/
|
||||||
|
sample-edits/
|
||||||
|
maps/
|
||||||
|
.direnv/
|
||||||
|
tmp/
|
||||||
|
edit/
|
36
.woodpecker.yml
Normal file
36
.woodpecker.yml
Normal 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
|
6
commitlint.config.js
Normal file
6
commitlint.config.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
module.exports = {
|
||||||
|
extends: ["@commitlint/config-conventional"],
|
||||||
|
rules: {
|
||||||
|
"body-max-line-length": [0],
|
||||||
|
},
|
||||||
|
};
|
205
fedran.json
205
fedran.json
|
@ -4,24 +4,32 @@
|
||||||
"character": {
|
"character": {
|
||||||
"pov": 100,
|
"pov": 100,
|
||||||
"name": "Rutejìmo",
|
"name": "Rutejìmo",
|
||||||
|
"character_slug": "rutejimo",
|
||||||
"color": "hsl(45, 40%, 50%)"
|
"color": "hsl(45, 40%, 50%)"
|
||||||
},
|
},
|
||||||
"source": {
|
"source": {
|
||||||
"pov": 100,
|
"pov": 100,
|
||||||
"volume": 1,
|
"volume": 1,
|
||||||
"title": "Sand and Ash",
|
"title": "Sand and Ash",
|
||||||
"status": "stable",
|
"word_count": 78850,
|
||||||
|
"length": "Novel",
|
||||||
|
"title_slug": "sand-and-ash",
|
||||||
|
"identifier_slug": "0100-01-sand-and-ash",
|
||||||
|
"copyright_year": 2018,
|
||||||
|
"status": "Stable",
|
||||||
"genres": [
|
"genres": [
|
||||||
"Drama",
|
"Drama",
|
||||||
"Romance"
|
"Romance"
|
||||||
],
|
],
|
||||||
|
"has_dedication": false,
|
||||||
"git": {
|
"git": {
|
||||||
"http_url": "https://gitlab.com/fedran/sand-and-ash.git",
|
"http_url": "https://src.mfgames.com/fedran-sources/sand-and-ash.git",
|
||||||
"branch": "master"
|
"branch": "master"
|
||||||
},
|
},
|
||||||
"links": {
|
"links": {
|
||||||
"development": {
|
"development": {
|
||||||
"git": "https://gitlab.com/fedran/sand-and-ash"
|
"git": "https://src.mfgames.com/fedran-sources/sand-and-ash/",
|
||||||
|
"issues": "https://src.mfgames.com/fedran-sources/sand-and-ash/issues"
|
||||||
},
|
},
|
||||||
"online": {
|
"online": {
|
||||||
"wattpad": "https://www.wattpad.com/story/46671031-sand-and-ash",
|
"wattpad": "https://www.wattpad.com/story/46671031-sand-and-ash",
|
||||||
|
@ -36,6 +44,197 @@
|
||||||
"amazon": "http://amzn.to/2Ho8lrs",
|
"amazon": "http://amzn.to/2Ho8lrs",
|
||||||
"typewriter": "https://store.typewriter.press/product/sand-and-ash/"
|
"typewriter": "https://store.typewriter.press/product/sand-and-ash/"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"cover": {
|
||||||
|
"cover_slug": "0100-01-sand-and-ash",
|
||||||
|
"title_page_lines": [
|
||||||
|
"Sand and Ash"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"warnings": {
|
||||||
|
"text": "This novel contains no scenes of sexual assault."
|
||||||
|
},
|
||||||
|
"chapters": [
|
||||||
|
{
|
||||||
|
"title": "Running Alone",
|
||||||
|
"word_count": 3236,
|
||||||
|
"summary": "Rutejìmo was running alone in the desert to relax after a difficult job getting two clans to sign a deal. When he finished his run, his older friend, Gemènyo, met him at the entrance of the cave and walks with him. Gemènyo asks Rutejìmo to join in a card game that night while slyly asking if Rutejìmo was interested in any women. He made a note that Rutejìmo tugged his tooth necklace whenever he thinks about Mikáryo, a night warrior.\nWhen Gemènyo left Rutejìmo for his own home cave, Rutejìmo continued to his own cave. He repacked and prepared his supplies for the next trip. When he finished, he came out just as Mapábyo, an adopted young woman of the clan, stopped him. She asked about the rites of passage and what would happen. Rutejìmo knew he couldn't tell her details so they just chatted.\nGemènyo joined them at the end of the conversation. He chastised her for asking for details and she ran off. Alone with Rutejìmo, Gemènyo teased Rutejìmo who doesn't realize that Mapábyo has a crush on him.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Decisions Made",
|
||||||
|
"word_count": 1271,
|
||||||
|
"summary": "Rutejìmo, Gemènyo, and Hyonèku are playing a card game together. The two older men teased Rutejìmo for his struggles but are otherwise friendly. Rutejìmo's brother, Desòchu, joins them as he discusses Mapábyo's rite of passage. Rutejìmo is uncomfortable in his brother's presence. Hyonèku doesn't want to participate since he is her father, so Desòchu decides to send Hyonèku and Rutejìmo on a job. Even though Rutejìmo is lead, Desòchu asks Hyonèku about a decision; Hyonèku reminds Desòchu that his brother is in charge to ask him.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Nightmares",
|
||||||
|
"word_count": 3140,
|
||||||
|
"summary": "Rutejìmo had a nightmare where Chimípu, the warrior woman who he shared a rite of passage with, and his brother killed Mikáryo.\nWhen he woke up, his fear of the dark made him panic. He went outside to catch his breath. Out there, he saw Chimípu talking with another warriors. She joined him after a moment and they talk about his struggles with his crush with Mikáryo. He is annoyed that everyone knows, but can't do anything. Chimípu also offers to bed him but he turned her down as he always does. She called him Little Brother and left him to his thoughts.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Corrupting Influence",
|
||||||
|
"word_count": 3886,
|
||||||
|
"summary": "Rutejìmo and Hyonèku come back from their mission to find out that Mapábyo survived her rite of passage. Pidòhu, who told them, also told Rutejìmo that Desòchu was angry at him. When Hyonèku accelerated to meet up with his daughter, Rutejìmo slowed down to think. He sneaked into the valley but Desòchu finds him and slammed him against the wall. Desòchu accused Rutejìmo of corrupting the youth because Mapábyo made a necklace out of a large snake creatures' tooth; Rutejìmo had the only other animal necklace in the clan and it was given to him by the night warrior, Mikáryo.\nOthers joined into the argument including Tejíko, Rutejìmo's and Desòchu's grandmother and leader of the clan. They ask Mapábyo to take off the necklace, which she did tearfully. Desòchu is still angry so Tejíko sent him to run it out around the valley.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Leaving the Cave",
|
||||||
|
"word_count": 2314,
|
||||||
|
"summary": "Rutejìmo woke up from a nightmare. He struggled to find a light to turn on, but Chimípu surprised him by being in his room. She used her flame aura to light up the room before insisting he go out and have breakfast with the rest of the clan. He resisted but eventually headed out. Normally he ate alone, but his normal spot was filled when the rest of the clan sat in the way. He was forced to sit next to Mapábyo. They talked about her now being an adult in the clan, her missions, and what to expect next.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "The Next Job",
|
||||||
|
"word_count": 2370,
|
||||||
|
"summary": "Rutejìmo relaxed on the top of the lookout at the clan, a high perch above the door. He watched Hyonèku pass the time by throwing rocks at the birds; the clan powers let them accelerate rocks and slings until they burst into flames and shot across the sky. Hyonèku bet Rutejìmo that he could hit the bird, but he missed. He convinced Rutejìmo to try, chiding him for not aiming to be mediocre, but Rutejìmo also missed.\nGemènyo's wife, Faríhyo, came up with their daughter, Nigímo, and took a chance. She hit the bird and sent Hyonèku after the animal that fell down. While he was gone, she asked Rutejìmo if he thought about finding a mate and having children. Rutejìmo hadn't.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "A Lending Hand",
|
||||||
|
"word_count": 1723,
|
||||||
|
"summary": "Rutejìmo ran behind five others as they approach the three rocks that his rite of passage had started. He was and has been the slowest ever since that point. He tripped and used that as an opportunity to walk in. However, Mapábyo came back for him and encourages him to keep going. This was the first time someone came back for him and he is encouraged to run the last quarter mile.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Wamifuko City",
|
||||||
|
"word_count": 1825,
|
||||||
|
"summary": "The six clan runners reached Wamifuko City, the largest city in the area. When they arrive, one of the city warriors, Gichyòbi, talked to Rutejìmo directly instead of addressing the leader of the group, Desòchu. This annoyed Rutejìmo's brother who then sends Rutejìmo on a tedious task while going ahead. Because Mapábyo spoke up for Rutejìmo, her mother, Kiríshi, gave Rutejìmo money to buy something for her.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Indecision",
|
||||||
|
"word_count": 1683,
|
||||||
|
"summary": "Flush with money from Kiríshi, Rutejìmo went out to buy a comb for Mapábyo from a vendor who he usually bought presents for Chimípu. But, when he finally came down to his final choices, he couldn't decide which comb to buy for which woman in his life. While he struggled with the choice, he saw a herd of black horses which reminded him of Mikáryo's herd. He buys randomly buys two combs and chased after the horses.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "A Late Encounter",
|
||||||
|
"word_count": 2663,
|
||||||
|
"summary": "After hours looking for Mikáryo, Rutejìmo stumbled on the one person who he never thought he would meet, Tsubàyo, who tried to kill Rutejìmo ten years ago. They have an awkward conversation until they are interrupted by Mikáryo. Rutejìmo struggled with talking with the woman he had fantasized about for ten years, more so when she invited him to her tent to drink.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Good Tales",
|
||||||
|
"word_count": 1398,
|
||||||
|
"summary": "Hours of drinking and talking, Rutejìmo learns a lot about Mikáryo and Tsubàyo. The man who had previously tried to kill Rutejìmo was now married and a talented \"horse thief\". He seemed happen, which surprised Rutejìmo. Tsubàyo left to sleep and Mikáryo invited Rutejìmo to spend the night (and lose his virginity).\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Speaking for Shimusògo",
|
||||||
|
"word_count": 3256,
|
||||||
|
"summary": "Two days of pleasure. Two days of finally being with his fantasy and obsession. Two days of ignoring his clan. Rutejìmo knew he was making mistakes, but he didn't care as long as he was with Mikáryo."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "A Second Chance",
|
||||||
|
"word_count": 1575,
|
||||||
|
"summary": "Beaten and kicked out of his clan, Rutejìmo had nowhere to go except back to Mikáryo. But, would the dark warrior accept him and give him shelter?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Drowning",
|
||||||
|
"word_count": 3042,
|
||||||
|
"summary": "Abandoned by everyone he knew, Rutejìmo retreated to a bar to lick his wounds and drown himself in a mug of alcohol. But sooner or later, the money would run out and then where would he be?"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Rutejìmo Walks",
|
||||||
|
"word_count": 1347,
|
||||||
|
"summary": "Banished from Wamifuko City, Rutejìmo has nowhere else to go. Walking away from Mapábyo, he starts walking as he contemplates his future and suicide. She chases after him and convinces him to travel with her to Monafuma Cliffs."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Banyosiōu",
|
||||||
|
"word_count": 1500,
|
||||||
|
"summary": "Running with Mapábyo, they end up at an oasis outside of Wamifuko City. Rutejìmo starts to speak for Shimusògo but then lets Mapábyo do it instead. Once the clan guarding the oasis accept them, Mapábyo goes to meet with the others while Rutejìmo tends to their private camp. When Mapábyo returns, she brings him uncolored cloths which is the sign of the banyosiōu, someone without a clan."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "The Wrong Words",
|
||||||
|
"word_count": 2712,
|
||||||
|
"summary": "Rutejìmo and Mapábyo reach a waypoint that she knows about. She digs out a supply cache to refill it and they get to talking about Mikáryo. But, when Rutejìmo mentions that he went back to Mikáryo, Mapábyo gets upset and attacks him. Before he can recover, she abandons him and leaves him alone in the desert."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Darkness",
|
||||||
|
"word_count": 683,
|
||||||
|
"summary": "Near the end of the days, Rutejìmo came up to a place to stop for the night, an oasis in the distance. He pushed to reach it before the sun dipped below the horizon and he lost his powers, but it was too late."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Exhaustion",
|
||||||
|
"word_count": 617,
|
||||||
|
"summary": "Rutejìmo finally reaches shelter at an oasis, but this was the first time he did as a banyosiōu, someone kicked out from his clan. He didn't know what to expect, but it wouldn't be long before his worst fears were confirmed."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Waking Up Alone",
|
||||||
|
"word_count": 1103,
|
||||||
|
"summary": "From his time during his coming of age, one of Rutejìmo's greatest fears was being alone in the desert. There were bandits, monsters, and natural disasters all laying in wait to destroy him. When he woke up alone in the desert, it was as if all of those fears had been laid out for him."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Silence",
|
||||||
|
"word_count": 2111,
|
||||||
|
"summary": "Time after time, Rutejìmo was turned away from the various oases as he chased after Mapábyo. With each rejection, his dehydration grew worse until he wasn't sure if the next stop would be his last."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "The Ghost",
|
||||||
|
"word_count": 791,
|
||||||
|
"summary": "Bound by silence as one of the terms of the clan who saved him, Rutejìmo learns quickly that his role as a banyosiōu involves a great deal back-breaking labor and learning how to get directions when no one will look at him."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Reunion",
|
||||||
|
"word_count": 1274,
|
||||||
|
"summary": "Rutejìmo continues to hunt for Mapábyo. Knowing he can't enter, he circles around one oasis and then heads on. He missed Mapábyo inside it but she sees him and chases after him. They make up.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Tijikóse",
|
||||||
|
"word_count": 1267,
|
||||||
|
"summary": "Rutejìmo and Mapábyo returned to the oasis where Kamanìo stayed. Rutejìmo held back as Mapábyo talked with the other clan and found shelter for the night. Then, without being told, he performed the duties as a banyosiōu and then returned to the tent to wait for Mapábyo.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Mikáryo",
|
||||||
|
"word_count": 1928,
|
||||||
|
"summary": "Out in the desert, Rutejìmo and Mapábyo stop for the night in a shelter. There, they talk about their lives and about the people who guided them over the years.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Return to Wamifuko City",
|
||||||
|
"word_count": 3794,
|
||||||
|
"summary": "Rutejìmo and Mapábyo return to Wamifuko City where they are met with Gichyòbi. Gichyòbi ignored Rutejìmo as he offers to house Mapábyo for the night. Once in private, however, Gichyòbi embraces Rutejìmo, telling him that he can't give Rutejìmo more than a night without getting in trouble. They spend the rest of the night talking.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Two Months Later",
|
||||||
|
"word_count": 4055,
|
||||||
|
"summary": "Rutejìmo is waiting for Mapábyo to arrive from her route. They have a weekend planned to spend together in Wamifuko City. However, as they enter the city, Gichyòbi joins them. Rutejìmo keeps to himself but he notices there are armed guards preventing him from leaving; he quickly finds out why when he finds the important members of the Shimusògo clan waiting for him inside the inn. Tejíko berates Mapábyo and demands she returns home. As Mapábyo is leaving in tears, Tejíko also slyly orders Rutejìmo to also return with her, but only if he remains silent.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Second Thoughts",
|
||||||
|
"word_count": 2688,
|
||||||
|
"summary": "In the months since Rutejìmo returned to the valley, the duties of a banyosiōu have bore down on him. Finally, he can't take it and decided to leave Mapábyo and flee for Wamifuko City. After the choice, he overhears decisions made by the clan to send Mapábyo on a long courier to try establishing a new trade agreement with a new clan. Hearing that, he decides to leave after she is gone.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "His Memorial",
|
||||||
|
"word_count": 2130,
|
||||||
|
"summary": "With Mapábyo gone on a mission, Rutejìmo is finally ready to flee for Wamifuko City or his death. Draped in depression, he lingers in his home for longer than he expected. Chimípu and Pidòhu surprise him by having an impromptu celebration for him bringing him food and drink while Mapábyo was gone and talking about their good friend.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Shifted Opinions",
|
||||||
|
"word_count": 2381,
|
||||||
|
"summary": "Realizing that the others cared for him, Rutejìmo found himself settling into being a banyosiōu in the valley. However, his brother had other opinions. During one dinner, Desòchu attacked Rutejìmo but was interrupted by a number of clan members who protected Rutejìmo while dancing around the topic. Hyonèku was particularly upset because Mapábyo was now pregnant with R's baby. The fight grew louder until Tejíko interrupted and broke it up.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "An Unexpected Role",
|
||||||
|
"word_count": 1550,
|
||||||
|
"summary": "While performing his duties as a banyosiōu, Rutejìmo is surprised when an old woman shows up and helps him with the rites. She knows more than him but says not a single word. When she leaves, she leaves behind a book and a path for Rutejìmo to follow.W\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Forbidden Words",
|
||||||
|
"word_count": 5589,
|
||||||
|
"summary": "It is a day of relaxation in the valley. Rutejìmo is coming up from doing his chores when Gemènyo and Faríhyo talk about leaving Mapábyo alone in the cave to spend time together; that meant Mapábyo would be alone to enjoy Rutejìmo's company. He starts over there but then notices that Gemènyo's and Faríhyo's daughter being pushed near the edge of the cliff. Realizing that the little girl was in danger, he broke his silence and yelled for help. The girl's parents were enough and he risked his brother's wrath to bring the entire clan to help. Desòchu saves Nigímo but Mapábyo is critically injured in the process.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Cremation",
|
||||||
|
"word_count": 2409,
|
||||||
|
"summary": "After starting Gemènyo's cremation, Rutejìmo returns to the valley because another person died. He is haunted by the idea that it was Mapábyo who died but it ended up behind his unborn child. Broken, he couldn't do anything but suffer until Chimípu and Hyonèku both broke the silence to comfort him.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Unshed Tears",
|
||||||
|
"word_count": 2369,
|
||||||
|
"summary": "As Rutejìmo is cremating the bodies, Desòchu approaches and apologizes for everything he has done. He talks about his regret and frustration that Rutejìmo has always followed his own way. When they finish, Rutejìmo returns home alone to comfort Mapábyo.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "His First Words",
|
||||||
|
"word_count": 2473,
|
||||||
|
"summary": "Rutejìmo's year is finally over and he can once again rejoin the clan. His first words are a marriage proposal to Mapábyo which the clan accepts.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Running Together",
|
||||||
|
"word_count": 697,
|
||||||
|
"summary": "Rutejìmo and Mapábyo race for Wamifuko City as the last stop before they head home for the birth of their child.\n"
|
||||||
}
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
58
flake.lock
Normal file
58
flake.lock
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1642700792,
|
||||||
|
"narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1643805626,
|
||||||
|
"narHash": "sha256-AXLDVMG+UaAGsGSpOtQHPIKB+IZ0KSd9WS77aanGzgc=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "554d2d8aa25b6e583575459c297ec23750adb6cb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1622516815,
|
||||||
|
"narHash": "sha256-ZjBd81a6J3TwtlBr3rHsZspYUwT9OdhDk+a/SgSEf7I=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "7e9b0dff974c89e070da1ad85713ff3c20b0ca97",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "21.05",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nixstable": "nixstable"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
28
flake.nix
Normal file
28
flake.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixstable.url = "nixpkgs/21.05";
|
||||||
|
nixpkgs.url = "nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, nixstable, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
stable = nixstable.legacyPackages.${system};
|
||||||
|
in {
|
||||||
|
devShell = pkgs.mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.epubcheck
|
||||||
|
pkgs.nixfmt
|
||||||
|
pkgs.nodejs-16_x
|
||||||
|
pkgs.pandoc
|
||||||
|
pkgs.pdftk
|
||||||
|
pkgs.python39Full
|
||||||
|
pkgs.python39Packages.weasyprint
|
||||||
|
pkgs.jq
|
||||||
|
pkgs.s3cmd
|
||||||
|
];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
11
matter/about.md
Normal file
11
matter/about.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
title: About D. Moonfire
|
||||||
|
---
|
||||||
|
|
||||||
|
D. Moonfire is the remarkable intersection of a computer nerd and a scientist. He inherited a desire for learning, endless curiosity, and a talent for being a polymath from both of his parents. Instead of focusing on a single genre, he writes stories and novels in many different settings ranging from fantasy to science fiction. He also throws in the occasional romance or forensics murder mystery to mix things up.
|
||||||
|
|
||||||
|
In addition to having a borderline unhealthy obsession with the written word, he is also a developer who loves to code as much as he loves writing.
|
||||||
|
|
||||||
|
He lives near Cedar Rapids, Iowa with his wife, numerous pet computers, and a pair of highly mobile things of the male variety.
|
||||||
|
|
||||||
|
You can see more work by D. Moonfire at his website at [https://d.moonfire.us/](https://d.moonfire.us/). His fantasy world, Fedran, can be found at [https://fedran.com/](https://fedran.com/).
|
13
matter/fedran.md
Normal file
13
matter/fedran.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
title: Fedran
|
||||||
|
---
|
||||||
|
|
||||||
|
Fedran is a world caught on the cusp of two great ages.
|
||||||
|
|
||||||
|
For centuries, the Crystal Age shaped society through the exploration of magic. Every creature had the ability to affect the world using talents and spells. The only limitation was imagination, will, and the inescapable rules of resonance. But as society grew more civilized, magic became less reliable and weaker.
|
||||||
|
|
||||||
|
When an unexpected epiphany seemingly breaks the laws of resonance, everything changed. Artifacts no longer exploded when exposed to spells, but only if they were wrapped in cocoons of steel and brass. The humble fire rune becomes the fuel for new devices, ones powered by steam and pressure. These machines herald the birth of a new age, the Industrial Age.
|
||||||
|
|
||||||
|
Now, the powers of the old age struggle against the onslaught of new technologies and an alien way of approaching magic. Either the world will adapt or it will be washed away in the relentless march of innovation.
|
||||||
|
|
||||||
|
To explore the world of Fedran, check out [https://fedran.com/](https://fedran.com/). There you'll find stories, novels, character write-ups and more.
|
27
matter/legal.md
Normal file
27
matter/legal.md
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
title: Legal
|
||||||
|
---
|
||||||
|
|
||||||
|
Copyright © 2018 D. Moonfire\
|
||||||
|
Some Rights Reserved\
|
||||||
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
This novel contains no scenes of sexual assault.
|
||||||
|
|
||||||
|
Broken Typewriter Press\
|
||||||
|
5001 1st Ave SE\
|
||||||
|
Ste 105 #243\
|
||||||
|
Cedar Rapids, IA 52402
|
||||||
|
|
||||||
|
Broken Typewriter Press\
|
||||||
|
[https://broken.typewriter.press/](https://broken.typewriter.press/)
|
||||||
|
|
||||||
|
{% if (edition.isbn) %}
|
||||||
|
ISBN {{edition.isbn}}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
Version {{edition.version}}
|
32
matter/license.md
Normal file
32
matter/license.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
title: License
|
||||||
|
---
|
||||||
|
|
||||||
|
This book is distributed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license. More info can be found at [https://creativecommons.org/licenses/by-nc-sa/4.0/](https://creativecommons.org/licenses/by-nc-sa/4.0/). This means:
|
||||||
|
|
||||||
|
### You are free to:
|
||||||
|
|
||||||
|
- Share — copy and redistribute the material in any medium or format
|
||||||
|
- Adapt — remix, transform, and build upon the material
|
||||||
|
|
||||||
|
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||||
|
|
||||||
|
### Under the following terms:
|
||||||
|
|
||||||
|
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
|
||||||
|
- NonCommercial — You may not use the material for commercial purposes.
|
||||||
|
- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
|
||||||
|
|
||||||
|
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
|
||||||
|
|
||||||
|
### Preferred Attribution
|
||||||
|
|
||||||
|
The preferred attribution for this novel is:
|
||||||
|
|
||||||
|
> "Sand and Ash" by D. Moonfire is licensed under CC BY-NC-SA 4.0
|
||||||
|
|
||||||
|
In the above attribution, use the following links:
|
||||||
|
|
||||||
|
- Flight of the Scions: [https://fedran.com/sand-and-ash/](https://fedran.com/sand-and-ash/)
|
||||||
|
- D. Moonfire: https://d.moonfire.us/
|
||||||
|
- CC BY-NC-SA 4.0: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
1
matter/pad.html
Normal file
1
matter/pad.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<br />
|
13
matter/title.html
Normal file
13
matter/title.html
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
title: Title
|
||||||
|
---
|
||||||
|
|
||||||
|
<div class="title">
|
||||||
|
<div class="title-area">
|
||||||
|
<div class="large">Sand and Ash</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="author">D. Moonfire</div>
|
||||||
|
|
||||||
|
<div class="publisher">Broken Typewriter Press • Cedar Rapids</div>
|
||||||
|
</div>
|
22615
package-lock.json
generated
22615
package-lock.json
generated
File diff suppressed because it is too large
Load diff
96
package.json
96
package.json
|
@ -1,86 +1,50 @@
|
||||||
{
|
{
|
||||||
"name": "sand-and-ash",
|
"name": "sand-and-ash",
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"fedran": {
|
"private": true,
|
||||||
"pov": "0100",
|
"description": "\"Sand and Ash\" is a novel by D. Moonfire.",
|
||||||
"vol": "01"
|
"author": {
|
||||||
|
"name": "D. Moonfire"
|
||||||
},
|
},
|
||||||
"description": "A novel by D. Moonfire",
|
|
||||||
"author": "D. Moonfire",
|
|
||||||
"license": "CC-BY-NC-SA-4.0",
|
"license": "CC-BY-NC-SA-4.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://gitlab.com/fedran/sand-and-ash.git"
|
"url": "git+https://src.mfgames.com/fedran-sources/sand-and-ash.git"
|
||||||
},
|
},
|
||||||
"homepage": "https://fedran.com/sand-and-ash/",
|
"homepage": "https://fedran.com/sand-and-ash/",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build:pdf": "mfgames-writing-format build pdf",
|
"build:pdf": "mfgames-writing-format build pdf",
|
||||||
"build:epub": "mfgames-writing-format build epub",
|
"build:epub": "mfgames-writing-format build epub",
|
||||||
"build": "npm run build:epub && npm run build:mobi && npm run build:pdf",
|
"build:docx": "mfgames-writing-format build docx",
|
||||||
"build:extended": "npm run build && npm run build:html && npm run build:docx",
|
"build": "run-s build:*",
|
||||||
"build:docx": "sed 's@­@@g' < dmoonfire-$npm_package_fedran_pov-$npm_package_fedran_vol-$npm_package_name-$npm_package_version.html | pandoc -f html -t docx -o dmoonfire-$npm_package_fedran_pov-$npm_package_fedran_vol-$npm_package_name-$npm_package_version.docx",
|
"prepare": "husky install"
|
||||||
"build:mobi": "kindlegen dmoonfire-$npm_package_fedran_pov-$npm_package_fedran_vol-$npm_package_name-$npm_package_version.epub",
|
|
||||||
"build:html": "mfgames-writing-format build html",
|
|
||||||
"prebuild:mobi": "npm run build:epub",
|
|
||||||
"prebuild": "rm -f $npm_package_name-*.* $npm_package_name.tar.bz2",
|
|
||||||
"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"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fedran/writing-hyphen": "^1.0.0",
|
"@fedran/writing-hyphen": "^1.0.0",
|
||||||
"@fedran/writing-theme": "^3.0.5",
|
"@fedran/writing-theme": "^4.0.2",
|
||||||
"@mfgames-writing/epub2": "^1.1.3",
|
"@mfgames-writing/contracts": "^4.4.0",
|
||||||
"@mfgames-writing/format": "^2.0.0",
|
"@mfgames-writing/docx-format": "^1.0.2",
|
||||||
|
"@mfgames-writing/epub2-format": "^2.1.1",
|
||||||
|
"@mfgames-writing/format": "^3.3.1",
|
||||||
"@mfgames-writing/guillemet": "^1.0.0",
|
"@mfgames-writing/guillemet": "^1.0.0",
|
||||||
"@mfgames-writing/html": "^0.1.1",
|
"@mfgames-writing/hyphen-pipeline": "^1.0.2",
|
||||||
"@mfgames-writing/hyphen": "^0.4.3",
|
"@mfgames-writing/liquid-theme": "^2.1.1",
|
||||||
"@mfgames-writing/weasyprint": "^4.0.0"
|
"@mfgames-writing/weasyprint-format": "^5.0.4",
|
||||||
|
"markdown-it-multimd-table": "^4.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^7.6.1",
|
"@commitlint/cli": "^15.0.0",
|
||||||
"@commitlint/config-conventional": "^7.6.0",
|
"@commitlint/config-conventional": "^15.0.0",
|
||||||
"@semantic-release/changelog": "^3.0.6",
|
"@saithodev/semantic-release-gitea": "^2.1.0",
|
||||||
"@semantic-release/git": "^7.0.18",
|
"@semantic-release/changelog": "^6.0.1",
|
||||||
"commitizen": "^2.10.1",
|
"@semantic-release/exec": "^6.0.3",
|
||||||
"cz-conventional-changelog": "^2.1.0",
|
"@semantic-release/git": "^10.0.1",
|
||||||
"husky": "^0.14.3",
|
"@semantic-release/npm": "^8.0.3",
|
||||||
"semantic-release": "^15.14.0"
|
"@semantic-release/release-notes-generator": "^10.0.3",
|
||||||
},
|
"husky": "^7.0.2",
|
||||||
"release": {
|
"markdowny": "^0.2.1",
|
||||||
"branch": "master",
|
"npm-run-all": "^4.1.5",
|
||||||
"message": "chore(release): v${nextRelease.version}\n\n${nextRelease.notes}",
|
"prettier": "^2.0.5",
|
||||||
"verifyConditions": [
|
"semantic-release": "^18.0.1"
|
||||||
"@semantic-release/changelog",
|
|
||||||
"@semantic-release/git"
|
|
||||||
],
|
|
||||||
"analyzeCommits": [
|
|
||||||
"@semantic-release/commit-analyzer"
|
|
||||||
],
|
|
||||||
"prepare": [
|
|
||||||
"@semantic-release/changelog",
|
|
||||||
"@semantic-release/npm",
|
|
||||||
"@semantic-release/git"
|
|
||||||
],
|
|
||||||
"publish": [],
|
|
||||||
"success": [],
|
|
||||||
"fail": []
|
|
||||||
},
|
|
||||||
"commitlint": {
|
|
||||||
"extends": [
|
|
||||||
"@commitlint/config-conventional"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"commitizen": {
|
|
||||||
"path": "./node_modules/cz-conventional-changelog"
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"private": true
|
|
||||||
}
|
}
|
||||||
|
|
123
publication.json
Normal file
123
publication.json
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"title": "{{edition.fedran.source.title}}",
|
||||||
|
"author": "D. Moonfire",
|
||||||
|
"language": "en",
|
||||||
|
"theme": "@fedran/writing-theme",
|
||||||
|
"outputDirectory": ".",
|
||||||
|
"outputFilename": "dmoonfire-{{edition.fedran.source.title_slug}}-{{edition.name}}-{{edition.version}}.{{edition.ext}}",
|
||||||
|
"markdown": {
|
||||||
|
"extensions": [
|
||||||
|
{
|
||||||
|
"package": "markdown-it-multimd-table",
|
||||||
|
"options": {
|
||||||
|
"headerless": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"style": {
|
||||||
|
"css": "td { width: 6em; } td[colspan=\"2\"] { width: 12em; }"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"includes": [
|
||||||
|
{
|
||||||
|
"json": "./fedran.json",
|
||||||
|
"merge": "metadata.fedran"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"editions": {
|
||||||
|
"epub": {
|
||||||
|
"format": "@mfgames-writing/epub2-format",
|
||||||
|
"ext": "epub"
|
||||||
|
},
|
||||||
|
"pdf": {
|
||||||
|
"format": "@mfgames-writing/weasyprint-format",
|
||||||
|
"isbn": "",
|
||||||
|
"images": {
|
||||||
|
"grayscale": true,
|
||||||
|
"opaque": true
|
||||||
|
},
|
||||||
|
"ext": "pdf"
|
||||||
|
},
|
||||||
|
"docx": {
|
||||||
|
"format": "@mfgames-writing/docx-format",
|
||||||
|
"ext": "docx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contents": [
|
||||||
|
{
|
||||||
|
"element": "cover",
|
||||||
|
"source": "build/fedran-covers/pov/covers/0100-01-sand-and-ash.jpg",
|
||||||
|
"linear": false,
|
||||||
|
"exclude": {
|
||||||
|
"editions": ["pdf"],
|
||||||
|
"toc": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "bastard",
|
||||||
|
"source": "matter/title.html",
|
||||||
|
"linear": false,
|
||||||
|
"exclude": {
|
||||||
|
"editions": ["epub", "html"],
|
||||||
|
"toc": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "title",
|
||||||
|
"source": "matter/title.html",
|
||||||
|
"linear": false,
|
||||||
|
"exclude": {
|
||||||
|
"toc": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "legal",
|
||||||
|
"source": "matter/legal.md",
|
||||||
|
"liquid": true,
|
||||||
|
"linear": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "toc",
|
||||||
|
"linear": false,
|
||||||
|
"title": "Contents",
|
||||||
|
"exclude": {
|
||||||
|
"editions": ["pdf"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "chapter",
|
||||||
|
"number": 1,
|
||||||
|
"directory": "chapters",
|
||||||
|
"source": "/^chapter-\\d+.(markdown|md)$/",
|
||||||
|
"start": true,
|
||||||
|
"page": 1,
|
||||||
|
"pipeline": [
|
||||||
|
{
|
||||||
|
"module": "@mfgames-writing/guillemet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "@fedran/writing-hyphen"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"module": "@mfgames-writing/hyphen-pipeline",
|
||||||
|
"exclude": ["`.*?`", "<code>.*?</code>"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "appendix",
|
||||||
|
"source": "matter/about.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "appendix",
|
||||||
|
"source": "matter/fedran.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"element": "appendix",
|
||||||
|
"id": "license",
|
||||||
|
"source": "matter/license.md"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
39
release.config.js
Normal file
39
release.config.js
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
module.exports = {
|
||||||
|
branches: ["main"],
|
||||||
|
|
||||||
|
extends: ["@commitlint/config-conventional"],
|
||||||
|
message:
|
||||||
|
"chore(release): v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
[
|
||||||
|
"@semantic-release/commit-analyzer",
|
||||||
|
|
||||||
|
{
|
||||||
|
preset: "conventionalcommits",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"@semantic-release/release-notes-generator",
|
||||||
|
"@semantic-release/npm",
|
||||||
|
[
|
||||||
|
"@semantic-release/exec",
|
||||||
|
{
|
||||||
|
prepareCmd: "npm run build",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"@semantic-release/changelog",
|
||||||
|
"@semantic-release/git",
|
||||||
|
|
||||||
|
[
|
||||||
|
"@saithodev/semantic-release-gitea",
|
||||||
|
{
|
||||||
|
giteaUrl: "https://src.mfgames.com",
|
||||||
|
assets: [
|
||||||
|
{ path: "*.epub", label: "EPUB2", type: "other" },
|
||||||
|
{ path: "*.pdf", label: "PDF", type: "other" },
|
||||||
|
{ path: "*.docx", label: "DOCX", type: "other" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
};
|
18
scripts/build.sh
Executable file
18
scripts/build.sh
Executable file
|
@ -0,0 +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.
|
||||||
|
log "setting up project"
|
||||||
|
./scripts/setup.sh || exit 1
|
||||||
|
|
||||||
|
# Build the project outputs.
|
||||||
|
log "building PDF"
|
||||||
|
npm run build:pdf || exit 1
|
||||||
|
|
||||||
|
log "building EPUB"
|
||||||
|
npm run build:epub || exit 1
|
27
scripts/check-env-bucket.sh
Executable file
27
scripts/check-env-bucket.sh
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Checks the environment to see if we have all the requisite components needed
|
||||||
|
# to upload or download from the S3 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
|
||||||
|
log "missing environment variable $i"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ! which s3cmd 2> /dev/null ]
|
||||||
|
then
|
||||||
|
log "cannot find 's3cmd' to execute"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
40
scripts/release.sh
Executable file
40
scripts/release.sh
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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))
|
||||||
|
|
||||||
|
# Perform the basic environment checks and setup.
|
||||||
|
./scripts/setup.sh || exit 1
|
||||||
|
./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.
|
||||||
|
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
|
||||||
|
log "packaging output into a tarball"
|
||||||
|
tar -cjf sand-and-ash.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 sand-and-ash.tar.bz2 s3://$S3_BUCKET || exit 1
|
||||||
|
else
|
||||||
|
log "no files to upload"
|
||||||
|
fi
|
||||||
|
|
31
scripts/setup-fedran-covers.sh
Executable file
31
scripts/setup-fedran-covers.sh
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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
|
||||||
|
log "fedran-covers already exists, not downloading"
|
||||||
|
else
|
||||||
|
# Make sure we have all the required environment variables.
|
||||||
|
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=$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
|
24
scripts/setup-fonts.sh
Executable file
24
scripts/setup-fonts.sh
Executable file
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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
|
||||||
|
log "not in CI environment, not installing fonts"
|
||||||
|
else
|
||||||
|
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
|
||||||
|
|
||||||
|
log "updating font caches"
|
||||||
|
fc-cache
|
||||||
|
fi
|
17
scripts/setup-node.sh
Executable file
17
scripts/setup-node.sh
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 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
|
||||||
|
log "node_modules already exists"
|
||||||
|
else
|
||||||
|
log "setting up node"
|
||||||
|
npm install --ci
|
||||||
|
fi
|
9
scripts/setup.sh
Executable file
9
scripts/setup.sh
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Move into the root folder.
|
||||||
|
cd $(dirname $(dirname $0))
|
||||||
|
|
||||||
|
# Run the setup commands.
|
||||||
|
./scripts/setup-fonts.sh || exit 1
|
||||||
|
./scripts/setup-fedran-covers.sh || exit 1
|
||||||
|
./scripts/setup-node.sh || exit 1
|
Loading…
Reference in a new issue