From a86e21b846177185bebfbf4011e1f9e29c998c69 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 13:01:05 -0500
Subject: [PATCH 01/76] Re-capitalize "Stranger Titan"
---
lib/convert-worker.js | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 8356f39..ff96285 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -503,15 +503,18 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/Radiata/g, "radiata");
xml = xml.replace(/Gemma/g, "gemma");
- // Especially early in the story, PRT designations are capitalized; they should not be. This fixes the cases where we
+ // Especially early in Worm, PRT designations are capitalized; they should not be. This fixes the cases where we
// can be reasonably sure they don't start a sentence, although more specific instances are done in
// substitutions.json, and some need to be back-corrected.
//
- // Note: "Master" is specifically omitted because it fails poorly on Interlude 4. Other instances need to be
+ // Note: "Master" is specifically omitted because it fails poorly on Worm Interlude 4. Other instances need to be
// corrected via substitutions.json.
+ //
+ // This also over-de-capitalizes "The Stranger" in Ward (a titan name). Those also get fixed in substitutions.json.
xml = xml.replace(
- /([a-zA-Z,] |\/)(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)/g,
- (_, prefix, designation) => prefix + designation.toLowerCase()
+ // eslint-disable-next-line max-len
+ /(?|“|\n|: )(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)(?! [A-Z])/g,
+ (_, designation) => designation.toLowerCase()
);
xml = xml.replace(
/(mover|shaker|brute|breaker|tinker|blaster|thinker|master|striker|changer|trump|stranger|shifter|shaper)-(\d+)/gi,
From cc151355fde1a430cbb8a091db9676b17e44039a Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 13:07:50 -0500
Subject: [PATCH 02/76] Re-capitalize "the Stranger"
---
lib/substitutions.json | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/lib/substitutions.json b/lib/substitutions.json
index d51c5a2..0c470f6 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -2987,7 +2987,7 @@
{
"before": "Unfortunate tinker",
"after": "Unfortunate tinker",
- "_comment": "See convert.js; this corrects an over-correction"
+ "_comment": "See convert-worker.js; this corrects an over-correction"
}
],
"https://parahumans.wordpress.com/2013/03/19/interlude-19/": [
@@ -3068,7 +3068,7 @@
{
"before": "the Clairvoyant",
"after": "the clairvoyant",
- "_comment": "see convert.js; this corrects an over-correction"
+ "_comment": "See convert-worker.js; this corrects an over-correction"
},
{
"before": "maintain eye contact. he could feel the warmth",
@@ -7724,6 +7724,11 @@
{
"before": "Victoria,” my Aunt said",
"after": "Victoria,” my aunt said"
+ },
+ {
+ "regExp": "([Tt]he) stranger",
+ "replacement": "$1 Stranger",
+ "_comment": "See convert-worker.js; this corrects an over-correction"
}
],
"https://www.parahumans.net/2019/12/28/infrared-19-2/": [
@@ -7738,6 +7743,11 @@
{
"before": "scream—no sound when viewing crystal-pictures, of course-, and",
"after": "scream—no sound when viewing crystal-pictures, of course—and"
+ },
+ {
+ "regExp": "([Tt]he) stranger",
+ "replacement": "$1 Stranger",
+ "_comment": "See convert-worker.js; this corrects an over-correction"
}
],
"https://www.parahumans.net/2020/01/01/interlude-19-a/": [
From 730cc512e393c91e61ca64996a7888620c616876 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 13:17:14 -0500
Subject: [PATCH 03/76] Capitalize "Titans"
---
lib/convert-worker.js | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index ff96285..ea79761 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -561,6 +561,15 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/english(?! muffin)/g, "English");
xml = xml.replace(/(?
Date: Sat, 19 Dec 2020 13:40:07 -0500
Subject: [PATCH 04/76] Consistently capitalize "Titan"
---
lib/convert-worker.js | 19 ++++++++-----
lib/substitutions.json | 60 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index ea79761..5873150 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -465,10 +465,6 @@ function fixCapitalization(xml, book) {
// The Speedrunners team name is missing its capitalization a couple times.
xml = xml.replace(/speedrunners/g, "Speedrunners");
- // Dauntless is a cape name. The majority of the time "Dauntless Titan" is fully capitalized, but either word
- // sometimes is missing its capitalization.
- xml = xml.replace(/dauntless titan/ig, "Dauntless Titan");
-
// Capitalization is inconsistent, but shard names seems to usually be capitalized.
xml = xml.replace(/Grasping self/g, "Grasping Self");
xml = xml.replace(/Cloven stranger/g, "Cloven Stranger");
@@ -563,11 +559,20 @@ function fixCapitalization(xml, book) {
// I was very torn on what to do with capitalization for "Titan" and "Titans". In general you don't capitalize species
// names or other classifications, e.g. style guides are quite clear you don't capitalize "gods". The author
- // capitalizes them more often than not (e.g., 179 raw "Titans" to 49 "titans"), but is quite inconsistent. In the
- // end, I decided for capitalization, based on the precedent set by "Endbringers" (which are conceptually paired with
- // Titans several times in the text).
+ // capitalizes them more often than not (e.g., 179 raw "Titans" to 49 "titans"), but is quite inconsistent.
+ //
+ // In the end, I decided against de-capitalization, based on the precedent set by "Endbringers" (which are
+ // conceptually paired with Titans several times in the text). However, we only capitalize the class after they are
+ // _introduced_ as a class in Sundown 17.y. (Before then we still capitalize individual names like "Dauntless Titan"
+ // or "Kronos Titan".)
if (book === "ward") {
+ // All plural discussions of "Titans" are after Sundown 17.y.
xml = xml.replace(/titans/g, "Titans");
+
+ // Since we can't safely change all instances of "titan", most are in substitutions.json. We can do a few here,
+ // though.
+ xml = xml.replace(/dauntless titan/ig, "Dauntless Titan"); // Sometimes "Dauntless" isn't even capitalized.
+ xml = xml.replace(/Kronos titan/g, "Kronos Titan");
}
return xml;
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 0c470f6..8249bd6 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -7622,18 +7622,30 @@
{
"before": "Because it made mom come",
"after": "Because it made Mom come"
+ },
+ {
+ "before": "new titan",
+ "after": "new Titan"
}
],
"https://www.parahumans.net/2019/11/12/interlude-17-z-sundown/": [
{
"before": "had his powers. the forcefield above",
"after": "had his powers. The forcefield above"
+ },
+ {
+ "regExp": "titan(?![a-z])",
+ "replacement": "Titan"
}
],
"https://www.parahumans.net/2019/11/16/radiation-18-1/": [
{
"before": "worked for the P.R.T.",
"after": "worked for the PRT."
+ },
+ {
+ "regExp": "titan(?![a-z])",
+ "replacement": "Titan"
}
],
"https://www.parahumans.net/2019/11/19/radiation-18-2/": [
@@ -7648,12 +7660,20 @@
{
"before": "tents last Winter or Spring",
"after": "tents last winter or spring"
+ },
+ {
+ "regExp": "titan(?![a-z])",
+ "replacement": "Titan"
}
],
"https://www.parahumans.net/2019/11/23/radiation-18-3/": [
{
"before": "in the eyes. they were a",
"after": "in the eyes. They were a"
+ },
+ {
+ "before": "first look at a titan",
+ "after": "first look at a Titan"
}
],
"https://www.parahumans.net/2019/11/26/radiation-18-4/": [
@@ -7668,12 +7688,20 @@
{
"before": "some business headquarters I was in
",
"after": "some business headquarters I was in."
+ },
+ {
+ "before": "hunched-over titan",
+ "after": "hunched-over Titan"
}
],
"https://www.parahumans.net/2019/12/03/radiation-18-6/": [
{
"before": "Some Master minions",
"after": "Some master minions"
+ },
+ {
+ "before": "bomb to a titan",
+ "after": "bomb to a Titan"
}
],
"https://www.parahumans.net/2019/12/07/radiation-18-7/": [
@@ -7706,6 +7734,18 @@
"after": "end of the summer"
}
],
+ "https://www.parahumans.net/2019/12/14/radiation-18-9/": [
+ {
+ "before": "the next titan",
+ "after": "the next Titan"
+ }
+ ],
+ "https://www.parahumans.net/2019/12/17/radiation-18-10/": [
+ {
+ "before": "one titan dogging me",
+ "after": "one Titan dogging me"
+ }
+ ],
"https://www.parahumans.net/2019/12/21/interlude-18-z-radiation/": [
{
"before": "face where her Uncle would see",
@@ -7748,6 +7788,10 @@
"regExp": "([Tt]he) stranger",
"replacement": "$1 Stranger",
"_comment": "See convert-worker.js; this corrects an over-correction"
+ },
+ {
+ "before": "because the titan was",
+ "after": "because the Titan was"
}
],
"https://www.parahumans.net/2020/01/01/interlude-19-a/": [
@@ -7764,6 +7808,14 @@
{
"before": "I thought of dad, seeing him hug my mother",
"after": "I thought of Dad, seeing him hug my mother"
+ },
+ {
+ "before": "One titan mobilizing",
+ "after": "One Titan mobilizing"
+ },
+ {
+ "before": "the horrifying titan",
+ "after": "the horrifying Titan"
}
],
"https://www.parahumans.net/2020/01/11/infrared-19-b/": [
@@ -7830,6 +7882,10 @@
{
"before": "-through the emotion. Emote through the emotion. Emote—",
"after": "—through the emotion. Emote through the emotion. Emote—"
+ },
+ {
+ "before": "titan Ophion’s",
+ "after": "Titan Ophion’s"
}
],
"https://www.parahumans.net/2020/01/25/infrared-19-d/": [
@@ -7912,6 +7968,10 @@
{
"before": "5’1 “",
"after": "5′1″"
+ },
+ {
+ "before": "pink and black titan",
+ "after": "pink and black Titan"
}
],
"https://www.parahumans.net/2020/02/25/last-20-1/": [
From 3aece3e05e486654da2960022f0b7c008d2f9351 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 14:40:21 -0500
Subject: [PATCH 05/76] Fix misspellings of "Tattletale"
---
lib/convert-worker.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 5873150..4c8e5c9 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -365,6 +365,9 @@ function standardizeNames(xml) {
// 13 instances of Elman to 1 of Elmann
xml = xml.replace(/Elmann/g, "Elman");
+ // Thousands of instances of Tattletale to 4 instances of Tatteltale
+ xml = xml.replace(/Tatteltale/g, "Tattletale");
+
return xml;
}
From 3e06358fa24003ccad81220bf8d7fde27554efe5 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 13:42:36 -0500
Subject: [PATCH 06/76] Spot fixes for Ward through Sundown 17.z
---
lib/convert-worker.js | 18 ++-
lib/substitutions.json | 276 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 283 insertions(+), 11 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 4c8e5c9..1cd668f 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -302,6 +302,9 @@ function fixTruncatedWords(xml) {
// Short for "Birdcage"
xml = xml.replace(/[‘’][Cc]age(?![a-z])/g, "’Cage");
+ // We can't do "’Clear" (short for Crystalclear) here because it appears too much as a normal word preceded by an
+ // open quote, so we do that in substitutions.json.
+
return xml;
}
@@ -396,6 +399,7 @@ function enDashJointNames(xml) {
// Joint names should use en dashes
xml = xml.replace(/Dallon-Pelham/g, "Dallon–Pelham");
xml = xml.replace(/Bet-Gimel/g, "Bet–Gimel");
+ xml = xml.replace(/Cheit-Gimel/g, "Bet–Gimel");
xml = xml.replace(/Tristan-Capricorn/g, "Tristan–Capricorn");
xml = xml.replace(/Capricorn-Byron/g, "Capricorn–Byron");
xml = xml.replace(/Tristan-Byron/g, "Tristan–Byron");
@@ -417,6 +421,8 @@ function enDashJointNames(xml) {
xml = xml.replace(/Crawler-Breed/g, "Crawler–Breed");
xml = xml.replace(/Simurgh-Myrddin-plant/g, "Simurgh–Myrddin–plant");
xml = xml.replace(/Armsmaster-Defiant/g, "Armsmaster–Defiant");
+ xml = xml.replace(/([Aa])gent-parahuman/g, "$1gent–parahuman");
+ xml = xml.replace(/([Pp])arahuman-agent/g, "$1arahuman–agent");
return xml;
}
@@ -425,7 +431,7 @@ function fixPossessives(xml) {
// Fix possessive of names ending in "s".
xml = xml.replace(
// eslint-disable-next-line max-len
- /(?".
@@ -525,6 +526,11 @@ function fixCapitalization(xml, book) {
"$1–$2"
);
+ // Capitalization is inconsistent, but shard names seems to usually be capitalized.
+ xml = xml.replace(/Grasping self/g, "Grasping Self");
+ xml = xml.replace(/Cloven stranger/g, "Cloven Stranger");
+ xml = xml.replace(/Princess shaper/g, "Princess Shaper");
+
// Place names need to always be capitalized
xml = xml.replace(/North end/g, "North End");
xml = xml.replace(/(Stonemast|Shale) avenue/g, "$1 Avenue");
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 8249bd6..a9ee5de 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -4162,6 +4162,10 @@
{
"before": "on the other earth",
"after": "on the other Earth"
+ },
+ {
+ "before": "name? did it start",
+ "after": "name? Did it start"
}
],
"https://parahumans.wordpress.com/2013/10/29/30-7/": [
@@ -6227,6 +6231,10 @@
{
"before": "apparently I",
"after": "apparently I"
+ },
+ {
+ "before": "Hey Little V",
+ "after": "Hey little V"
}
],
"https://www.parahumans.net/2019/01/29/blinding-11-10/": [
@@ -6272,7 +6280,7 @@
},
{
"before": "Go you, Little V.",
- "after": "Go you, Little V."
+ "after": "Go you, little V."
},
{
"before": "the King on the chess board",
@@ -6657,10 +6665,6 @@
{
"before": "For some of the heartbroken",
"after": "For some of the Heartbroken"
- },
- {
- "before": "agent-parahuman",
- "after": "agent–parahuman"
}
],
"https://www.parahumans.net/2019/04/20/black-13-6/": [
@@ -7556,36 +7560,172 @@
{
"before": "Some—many- were unwillingly",
"after": "Some—many—were unwillingly"
+ },
+ {
+ "before": "looking down at my hand at her arm and my hand",
+ "after": "looking down at her arm and my hand"
+ },
+ {
+ "before": "more more thing hanging over our heads",
+ "after": "one more thing hanging over our heads"
+ },
+ {
+ "before": "my mothers cheeks",
+ "after": "my mother’s cheeks"
+ },
+ {
+ "before": "—Understand, please",
+ "after": "—understand, please"
+ },
+ {
+ "before": "“Victoria,” Crystal’s voice was gentle",
+ "after": "“Victoria.” Crystal’s voice was gentle"
}
],
"https://www.parahumans.net/2019/10/05/sundown-17-2/": [
{
"before": "egg for Crystal and mom",
"after": "egg for Crystal and Mom"
+ },
+ {
+ "before": "Me:
",
+ "after": "
Me:
"
+ },
+ {
+ "before": "
Vista (Little V):
",
+ "after": "
Vista (Little V):
"
+ },
+ {
+ "before": "few minutes of peace, damn it.—",
+ "after": "few minutes of peace, damn it—"
+ },
+ {
+ "regExp": "‘Clear",
+ "replacement": "’Clear"
}
],
"https://www.parahumans.net/2019/10/08/sundown-17-3/": [
{
"before": "say, Math class",
"after": "say, math class"
+ },
+ {
+ "before": "hang outs",
+ "after": "hangouts"
+ },
+ {
+ "before": "‘",
+ "after": "’"
+ },
+ {
+ "before": "“—Which I’m not.”",
+ "after": "“—which I’m not.”"
+ },
+ {
+ "before": "Vista for the kid’s sake",
+ "after": "Vista for the kids’ sake"
+ },
+ {
+ "before": "Day to day activities",
+ "after": "Day-to-day activities"
+ },
+ {
+ "before": "tower crescent avenue",
+ "after": "Tower Crescent Avenue"
+ },
+ {
+ "before": "all had to deal with ‘heavy’.",
+ "after": "all had to deal with ‘heavy’.”"
+ },
+ {
+ "before": "stuff?” I spoke up, “it get into that control",
+ "after": "stuff?” I spoke up. “It gets into that control"
+ },
+ {
+ "before": "talked to me a like",
+ "after": "talked to me like"
+ },
+ {
+ "before": "call me Big V",
+ "after": "call me big V"
}
],
"https://www.parahumans.net/2019/10/12/sundown-17-4/": [
{
"before": "on resisting Master influence",
"after": "on resisting master influence"
+ },
+ {
+ "before": "CDs and Vinyls",
+ "after": "CDs and vinyls"
+ },
+ {
+ "before": "“P.R.T.”",
+ "after": "“PRT.”"
+ },
+ {
+ "before": "second or third string Wardens",
+ "after": "second- or third-string Wardens"
+ },
+ {
+ "before": "intern level clerks",
+ "after": "intern-level clerks"
+ },
+ {
+ "before": "half way",
+ "after": "halfway"
+ },
+ {
+ "before": "her tone didn’t soft",
+ "after": "her tone didn’t soften"
+ },
+ {
+ "before": "Jessica, Mr…",
+ "after": "Jessica, Mr.…"
+ },
+ {
+ "before": "—Captive",
+ "after": "—captive"
+ },
+ {
+ "before": "come from? what language",
+ "after": "come from? What language"
}
],
"https://www.parahumans.net/2019/10/15/sundown-17-5/": [
{
"before": "Is mom walking without difficulty",
"after": "Is Mom walking without difficulty"
+ },
+ {
+ "before": "Through valkyrie",
+ "after": "Through Valkyrie"
+ },
+ {
+ "before": "“‘Lo.”",
+ "after": "“’Lo.”"
}
],
"https://www.parahumans.net/2019/10/19/sundown-17-6/": [
{
"before": "Probably dad",
"after": "Probably Dad"
+ },
+ {
+ "before": "and no and no rejiggered rat",
+ "after": "and no rejiggered rat"
+ },
+ {
+ "before": "Harder headed",
+ "after": "Harder-headed"
+ },
+ {
+ "before": "you proved my sister right? Tired,",
+ "after": "you proved my sister right? Tired,"
+ },
+ {
+ "before": "boundary,” He whispered",
+ "after": "boundary,” he whispered"
}
],
"https://www.parahumans.net/2019/10/22/sundown-17-7/": [
@@ -7596,6 +7736,10 @@
{
"before": "Golem explained
",
"after": "Golem explained."
+ },
+ {
+ "before": "see the Lab",
+ "after": "see the lab"
}
],
"https://www.parahumans.net/2019/10/26/sundown-17-8/": [
@@ -7606,6 +7750,40 @@
{
"before": "She’s aggressive If anyone makes",
"after": "She’s aggressive. If anyone makes"
+ },
+ {
+ "before": "—They mobbed Lookout",
+ "after": "—they mobbed Lookout"
+ },
+ {
+ "before": "Of Course Kenzie",
+ "after": "Of course Kenzie"
+ },
+ {
+ "before": "Rain about Girls",
+ "after": "Rain about girls"
+ },
+ {
+ "before": "I typed: The one",
+ "after": "I typed: The one"
+ },
+ {
+ "before": "realize,” Seir called out. “If a fight",
+ "after": "realize,” Seir called out, “if a fight"
+ },
+ {
+ "before": "was emotion resistant",
+ "after": "was emotion-resistant"
+ }
+ ],
+ "https://www.parahumans.net/2019/10/29/sundown-17-9/": [
+ {
+ "before": "—Are you going to be wishing",
+ "after": "—are you going to be wishing"
+ },
+ {
+ "before": "Asking question?",
+ "after": "Asking a question?"
}
],
"https://www.parahumans.net/2019/11/02/sundown-17-10/": [
@@ -7616,6 +7794,40 @@
{
"before": "that didn’t betray too much",
"after": "that didn’t betray too much."
+ },
+ {
+ "before": "say Molasses",
+ "after": "say molasses"
+ },
+ {
+ "before": "‘nother",
+ "after": "’nother"
+ },
+ {
+ "before": "‘she peed on me!’",
+ "after": "‘she peed on me!’."
+ },
+ {
+ "before": "madam Mayor",
+ "after": "Madam Mayor"
+ }
+ ],
+ "https://www.parahumans.net/2019/11/05/interlude-17-x-sundown/": [
+ {
+ "before": "five-o’clock shadow",
+ "after": "five o’clock shadow"
+ },
+ {
+ "before": "nervous looking guy",
+ "after": "nervous-looking guy"
+ },
+ {
+ "before": "you have drugs? Alcohol? Cigarettes? I have",
+ "after": "you have drugs? Alcohol? Cigarettes? I have"
+ },
+ {
+ "before": "Not by mom or dad",
+ "after": "Not by Mom or Dad"
}
],
"https://www.parahumans.net/2019/11/09/interlude-17-y-sundown/": [
@@ -7626,6 +7838,14 @@
{
"before": "new titan",
"after": "new Titan"
+ },
+ {
+ "before": "anti parahumans",
+ "after": "anti-parahumans"
+ },
+ {
+ "before": "hit the Anti-parahumans",
+ "after": "hit the anti-parahumans"
}
],
"https://www.parahumans.net/2019/11/12/interlude-17-z-sundown/": [
@@ -7636,6 +7856,42 @@
{
"regExp": "titan(?![a-z])",
"replacement": "Titan"
+ },
+ {
+ "before": "What if you weren’t?",
+ "after": "What if you weren’t?"
+ },
+ {
+ "before": "Victor, Can you go join Tribute",
+ "after": "Victor, can you go join Tribute"
+ },
+ {
+ "before": "The forcefield above him elaborate and getting",
+ "after": "The forcefield above him was elaborate and getting"
+ },
+ {
+ "before": "Their faculties were diminished, but",
+ "after": "Their faculties were diminished, but—"
+ },
+ {
+ "before": "Flashbang, he saw was one of the",
+ "after": "Flashbang, he saw, was one of the"
+ },
+ {
+ "before": "the palm, Out each foot, and out of the mouth.lifting one",
+ "after": "the palm. Out each foot, and out of the mouth. Lifting one"
+ },
+ {
+ "before": "no eyes; only a blindfold",
+ "after": "no eyes, only a blindfold"
+ },
+ {
+ "before": "lightness of a feather landing, came to perch",
+ "after": "lightness of a feather landing, it came to perch"
+ },
+ {
+ "before": "…The only things that are",
+ "after": "…the only things that are"
}
],
"https://www.parahumans.net/2019/11/16/radiation-18-1/": [
@@ -7816,6 +8072,16 @@
{
"before": "the horrifying titan",
"after": "the horrifying Titan"
+ },
+ {
+ "before": "that stranger",
+ "after": "that Stranger"
+ }
+ ],
+ "https://www.parahumans.net/2020/01/07/infrared-19-4/": [
+ {
+ "before": "talked to them? or done",
+ "after": "talked to them? Or done"
}
],
"https://www.parahumans.net/2020/01/11/infrared-19-b/": [
From 5ff6621b31a000c194f46f9d9426b5af91ec78fa Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 14:44:29 -0500
Subject: [PATCH 07/76] Hyphenate a variety of words starting with "self-"
Previously we only did self-conscious; this brings along self-esteem, self-loathing, and self-harm.
---
lib/convert-worker.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1cd668f..bf9c938 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -627,7 +627,7 @@ function fixHyphens(xml) {
xml = xml.replace(/creepy crawl/g, "creepy-crawl");
xml = xml.replace(/well armed/g, "well-armed");
xml = xml.replace(/able bodied/g, "able-bodied");
- xml = xml.replace(/self conscious/g, "self-conscious");
+ xml = xml.replace(/self (conscious|esteem|loathing|harm)/g, "self-$1");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
From 8a9562e10eaac3f2800559e4923b27cf903e1118 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 14:52:03 -0500
Subject: [PATCH 08/76] Hyphenate "level-headed"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index bf9c938..86f5ca5 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -627,6 +627,7 @@ function fixHyphens(xml) {
xml = xml.replace(/creepy crawl/g, "creepy-crawl");
xml = xml.replace(/well armed/g, "well-armed");
xml = xml.replace(/able bodied/g, "able-bodied");
+ xml = xml.replace(/level headed/g, "level-headed");
xml = xml.replace(/self (conscious|esteem|loathing|harm)/g, "self-$1");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
From 631417a53004cf274e6d71636a3b036dd603be10 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 14:55:37 -0500
Subject: [PATCH 09/76] Capitalize "Fragile One"
---
lib/convert-worker.js | 1 +
lib/substitutions.json | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 86f5ca5..1b7d4e4 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -530,6 +530,7 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/Grasping self/g, "Grasping Self");
xml = xml.replace(/Cloven stranger/g, "Cloven Stranger");
xml = xml.replace(/Princess shaper/g, "Princess Shaper");
+ xml = xml.replace(/Fragile one/g, "Fragile One");
// Place names need to always be capitalized
xml = xml.replace(/North end/g, "North End");
diff --git a/lib/substitutions.json b/lib/substitutions.json
index a9ee5de..3b81b22 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -7774,6 +7774,10 @@
{
"before": "was emotion resistant",
"after": "was emotion-resistant"
+ },
+ {
+ "before": "Thank you, fragile one",
+ "after": "Thank you, Fragile One"
}
],
"https://www.parahumans.net/2019/10/29/sundown-17-9/": [
@@ -7948,6 +7952,14 @@
{
"before": "hunched-over titan",
"after": "hunched-over Titan"
+ },
+ {
+ "before": "experience the world, fragile one",
+ "after": "experience the world, Fragile One"
+ },
+ {
+ "before": "chime in, fragile one",
+ "after": "chime in, Fragile One"
}
],
"https://www.parahumans.net/2019/12/03/radiation-18-6/": [
@@ -8152,6 +8164,14 @@
{
"before": "titan Ophion’s",
"after": "Titan Ophion’s"
+ },
+ {
+ "before": "Work with me, fragile one",
+ "after": "Work with me, Fragile One"
+ },
+ {
+ "before": "‘fragile one’",
+ "after": "‘Fragile One’"
}
],
"https://www.parahumans.net/2020/01/25/infrared-19-d/": [
From 9fc36b813fa5f8119406328d20e9cdacf1a2df12 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 14:59:08 -0500
Subject: [PATCH 10/76] Hyphenate "clear-cut"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1b7d4e4..1d40868 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -629,6 +629,7 @@ function fixHyphens(xml) {
xml = xml.replace(/well armed/g, "well-armed");
xml = xml.replace(/able bodied/g, "able-bodied");
xml = xml.replace(/level headed/g, "level-headed");
+ xml = xml.replace(/clear cut/g, "clear-cut");
xml = xml.replace(/self (conscious|esteem|loathing|harm)/g, "self-$1");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
From 442d245e2d10af20b534e417243bd558d38e96b2 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 15:55:38 -0500
Subject: [PATCH 11/76] Remove more non-breaking spaces
Also normalizes after-sentence spaces to two (normal) spaces, but that's not visible to readers.
---
lib/convert-worker.js | 13 ++++++++-----
lib/substitutions.json | 13 +++++++++++--
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1d40868..36b043b 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -140,11 +140,14 @@ function getBodyXML(chapter, book, contentEl) {
xml = xml.replace(/([^ ]+)<\/i>/g, "$1");
xml = xml.replace(/([^ ]+)( +)<\/i>/g, "$1$2");
- // There are way too many nonbreaking spaces where they don't belong.
- // If they show up three in a row, then let them live. Otherwise, they die.
- // Also remove any run of them after a period.
- xml = xml.replace(/([^\xA0])\xA0\xA0?([^\xA0])/g, "$1 $2");
- xml = xml.replace(/\.\x20*\xA0[\xA0\x20]*/, ". ");
+ // There are way too many nonbreaking spaces where they don't belong. If they show up three in a row, then let them
+ // live; they're maybe being used for alignment or something. Otherwise, they die.
+ //
+ // Also, normalize spaces after a period/quote mark to two (normal) spaces. The second one is invisible when
+ // rendered, but it helps future heuristics detect end of sentences.
+ xml = xml.replace(/\xA0{1,2}(?!\x20\xA0)/g, " ");
+ xml = xml.replace(/([.”])\x20*\xA0[\xA0\x20]*/g, "$1 ");
+ xml = xml.replace(/([.”])\x20{3,}/g, "$1 ");
function fixEms() {
// Fix recurring broken-up or erroneous s
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 3b81b22..d3ba79c 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -1200,6 +1200,11 @@
{
"before": "of her head, “And my",
"after": "of her head. “And my"
+ },
+ {
+ "before": "KOOROW BULLIT
\nMILK STUMPY
\nBROOTUS JOODUS
\nAXIL GINGIR",
+ "after": "KOOROW\u00A0\u00A0\u00A0BULLIT
\nMILK\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0STUMPY
\nBROOTUS\u00A0\u00A0JOODUS
\nAXIL\u00A0\u00A0\u00A0\u00A0\u00A0GINGIR",
+ "_comment": "This section plays poorly with our space-normalizing heuristic."
}
],
"https://parahumans.wordpress.com/2012/03/31/interlude-8/": [
@@ -2925,6 +2930,10 @@
{
"before": "and be brought it",
"after": "and he brought it"
+ },
+ {
+ "before": "propellers One caught her",
+ "after": "propellers. One caught her"
}
],
"https://parahumans.wordpress.com/2013/03/02/scourge-19-4/": [
@@ -6569,7 +6578,7 @@
"after": "morning breath—more than morning breath—but there"
},
{
- "before": "Previous Chapter Next Chapter
\n\n\n\n\n\n\n\n\n\n\n\n",
+ "before": "Previous Chapter Next Chapter
\n\n\n\n\n\n\n\n\n\n\n\n",
"after": "
\n
",
"_comment": "This is the best way I can think of to emulate the end of chapter 'fake out' in an ebook format"
},
@@ -6596,7 +6605,7 @@
],
"https://www.parahumans.net/2019/04/02/black-13-1/": [
{
- "before": "⊙
\nPrevious Chapter Next Chapter
\n",
+ "before": "⊙
\nPrevious Chapter Next Chapter
\n",
"after": "",
"_comment": "Our usual heuristics of removing the first paragraph to remove the previous/next chapter links are broken here because of the 'go back and look at the fake out' comment at the top"
},
From 5b7ec80750554c63732fbf13f37f1c003ad3bbed Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 16:53:26 -0500
Subject: [PATCH 12/76] Spot fixes for Ward through Infrared 19.4
---
lib/convert-worker.js | 2 +-
lib/substitutions.json | 257 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 258 insertions(+), 1 deletion(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 36b043b..7e36b60 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -485,7 +485,7 @@ function fixCapitalization(xml, book) {
// This usually works in Ward (some instances corrected back in substitutions.json), and has a few false positives in
// Worm, where it is never needed:
if (book === "ward") {
- xml = xml.replace(/the patrol(?!s)/g, "the Patrol");
+ xml = xml.replace(/the patrol(?!s|ling)/g, "the Patrol");
}
// This is sometimes missing its capitalization.
diff --git a/lib/substitutions.json b/lib/substitutions.json
index d3ba79c..5fe4175 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -7933,6 +7933,30 @@
{
"regExp": "titan(?![a-z])",
"replacement": "Titan"
+ },
+ {
+ "before": "condemnation free",
+ "after": "condemnation-free"
+ },
+ {
+ "before": "eyes heavily decorate with gray",
+ "after": "eyes heavily decorated with gray"
+ },
+ {
+ "before": "Yuh!",
+ "after": "Yuh!"
+ },
+ {
+ "before": "cultured accent, “Is that us",
+ "after": "cultured accent, “is that us"
+ },
+ {
+ "before": "to force one.”",
+ "after": "to force one’.”"
+ },
+ {
+ "before": "between the Titans Pull",
+ "after": "between the Titans. Pull"
}
],
"https://www.parahumans.net/2019/11/23/radiation-18-3/": [
@@ -7943,6 +7967,18 @@
{
"before": "first look at a titan",
"after": "first look at a Titan"
+ },
+ {
+ "before": "too much fo a retreat",
+ "after": "too much of a retreat"
+ },
+ {
+ "before": "said, “after we were all",
+ "after": "said, “After we were all"
+ },
+ {
+ "before": "reconicle",
+ "after": "reconcile"
}
],
"https://www.parahumans.net/2019/11/26/radiation-18-4/": [
@@ -7969,6 +8005,60 @@
{
"before": "chime in, fragile one",
"after": "chime in, Fragile One"
+ },
+ {
+ "before": "syndicate-awareness",
+ "after": "Syndicate-awareness"
+ },
+ {
+ "before": "gray Jester Mockument was like",
+ "after": "gray jester Mockument like"
+ },
+ {
+ "before": "he halfway back",
+ "after": "he was halfway back"
+ },
+ {
+ "before": "master of biology",
+ "after": "mastery of biology"
+ },
+ {
+ "before": "for most move, or raise",
+ "after": "for most moves, or raise"
+ },
+ {
+ "before": "wasn’t hookline’s",
+ "after": "wasn’t Hookline’s"
+ },
+ {
+ "before": "Chicken little",
+ "after": "Chicken Little"
+ }
+ ],
+ "https://www.parahumans.net/2019/11/30/radiation-18-5/": [
+ {
+ "before": "jumping of a cardboard",
+ "after": "jumping off a cardboard"
+ },
+ {
+ "before": "Tattletale said. “That breastplate",
+ "after": "Tattletale said, “that breastplate"
+ },
+ {
+ "before": "they were gas damaged",
+ "after": "they were gas-damaged"
+ },
+ {
+ "before": "“skewer them to",
+ "after": "“Skewer them to"
+ },
+ {
+ "before": "…You have to conserve",
+ "after": "…you have to conserve"
+ },
+ {
+ "before": "Shorcut",
+ "after": "Shortcut"
}
],
"https://www.parahumans.net/2019/12/03/radiation-18-6/": [
@@ -7979,6 +8069,14 @@
{
"before": "bomb to a titan",
"after": "bomb to a Titan"
+ },
+ {
+ "before": "military inspired",
+ "after": "military-inspired"
+ },
+ {
+ "before": "a rough fight",
+ "after": "a rough flight"
}
],
"https://www.parahumans.net/2019/12/07/radiation-18-7/": [
@@ -8009,18 +8107,80 @@
{
"before": "end of the Summer",
"after": "end of the summer"
+ },
+ {
+ "before": "five pound phone",
+ "after": "five-pound phone"
+ },
+ {
+ "before": "He was slowly knitting itself together",
+ "after": "He was slowly knitting himself together"
+ },
+ {
+ "before": "and uh, Stables",
+ "after": "and uh, stables"
+ },
+ {
+ "before": "feel the meta tines",
+ "after": "feel the metal tines"
+ },
+ {
+ "before": "back at the Workshop",
+ "after": "back at the workshop"
+ },
+ {
+ "before": "Victoria,” My uncle",
+ "after": "Victoria,” my uncle"
+ }
+ ],
+ "https://www.parahumans.net/2019/12/10/radiation-18-8/": [
+ {
+ "before": "Parahuman Sciences",
+ "after": "parahuman sciences"
+ },
+ {
+ "before": "protocols in action.’",
+ "after": "protocols in action’."
+ },
+ {
+ "before": "“—Too close",
+ "after": "“—too close"
+ },
+ {
+ "before": "Ten-thirty-six",
+ "after": "Ten thirty-six"
+ },
+ {
+ "before": "“—He was warm and safe",
+ "after": "“—he was warm and safe"
}
],
"https://www.parahumans.net/2019/12/14/radiation-18-9/": [
{
"before": "the next titan",
"after": "the next Titan"
+ },
+ {
+ "before": "Kenzie said. Give me a minute.",
+ "after": "Kenzie said. “Give me a minute."
+ },
+ {
+ "before": "Sveta said. Especially if we",
+ "after": "Sveta said. “Especially if we"
+ },
+ {
+ "before": "from the cold, though his face",
+ "after": "from the cold; though his face"
}
],
"https://www.parahumans.net/2019/12/17/radiation-18-10/": [
{
"before": "one titan dogging me",
"after": "one Titan dogging me"
+ },
+ {
+ "before": "Capes on two rises",
+ "after": "Capes on two risers"
}
],
"https://www.parahumans.net/2019/12/21/interlude-18-z-radiation/": [
@@ -8035,6 +8195,15 @@
{
"before": "and saw her Aunt and Uncle approaching",
"after": "and saw her aunt and uncle approaching"
+ },
+ {
+ "regExp": "([Tt]he) Giantess",
+ "replacement": "$1 giantess",
+ "_comment": "14 other instances in this chapter are not capitalized"
+ },
+ {
+ "before": "had allies. connections.",
+ "after": "had allies. Connections."
}
],
"https://www.parahumans.net/2019/12/24/infrared-19-1/": [
@@ -8046,6 +8215,14 @@
"regExp": "([Tt]he) stranger",
"replacement": "$1 Stranger",
"_comment": "See convert-worker.js; this corrects an over-correction"
+ },
+ {
+ "before": "doing the damage herself",
+ "after": "doing the damage themselves"
+ },
+ {
+ "before": "This? This",
+ "after": "This? This"
}
],
"https://www.parahumans.net/2019/12/28/infrared-19-2/": [
@@ -8069,6 +8246,46 @@
{
"before": "because the titan was",
"after": "because the Titan was"
+ },
+ {
+ "before": "endless flesh monster were",
+ "after": "endless flesh monsters were"
+ },
+ {
+ "before": "putting it of balance",
+ "after": "putting it off balance"
+ },
+ {
+ "before": "What lay us below",
+ "after": "What lay below us"
+ },
+ {
+ "before": "Do you have any regrets now?",
+ "after": "Do you have any regrets now?"
+ },
+ {
+ "before": "Stygean Blue",
+ "after": "stygian blue"
+ },
+ {
+ "before": "Except the feeling of breached",
+ "after": "Except the feeling of being breached"
+ },
+ {
+ "before": "best guess of it’s location",
+ "after": "best guess of its location"
+ },
+ {
+ "before": "Dream Room",
+ "after": "dream room"
+ },
+ {
+ "before": "‘EM",
+ "after": "’EM"
+ },
+ {
+ "before": "In effect, Powers were different",
+ "after": "In effect, powers were different"
}
],
"https://www.parahumans.net/2020/01/01/interlude-19-a/": [
@@ -8079,6 +8296,30 @@
{
"before": "can’t induce triggers There were parahumans",
"after": "can’t induce triggers. There were parahumans"
+ },
+ {
+ "before": "into the conversation, “You do some",
+ "after": "into the conversation, “you do some"
+ },
+ {
+ "before": "None of us do, Egg thought",
+ "after": "None of us do, Egg thought"
+ },
+ {
+ "before": "Our ‘number zero’s wife",
+ "after": "Our ‘number zero’s’ wife"
+ },
+ {
+ "before": "his voice was hard, “You took",
+ "after": "his voice was hard, “you took"
+ },
+ {
+ "before": "You don’t get to do that!",
+ "after": "You don’t get to do that!"
+ },
+ {
+ "before": "Almost a Figurehead",
+ "after": "Almost a figurehead"
}
],
"https://www.parahumans.net/2020/01/04/infrared-19-3/": [
@@ -8097,12 +8338,28 @@
{
"before": "that stranger",
"after": "that Stranger"
+ },
+ {
+ "before": "I could Strands worked to braid together",
+ "after": "I could see strands working to braid together"
+ },
+ {
+ "before": "any of the Master Protocols",
+ "after": "any of the master protocols"
}
],
"https://www.parahumans.net/2020/01/07/infrared-19-4/": [
{
"before": "talked to them? or done",
"after": "talked to them? Or done"
+ },
+ {
+ "before": "all nighters",
+ "after": "all-nighters"
+ },
+ {
+ "before": "the other cases",
+ "after": "the other Cases"
}
],
"https://www.parahumans.net/2020/01/11/infrared-19-b/": [
From 1a0780bd7b3326645e716f2d5e52fe2eac4a8ac5 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 16:55:34 -0500
Subject: [PATCH 13/76] Capitalize "Aunt Sarah"
---
lib/convert-worker.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 7e36b60..136db35 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -554,6 +554,9 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/(?
Date: Sat, 19 Dec 2020 17:03:33 -0500
Subject: [PATCH 14/76] Fix hyphenation for high five and fist bump
---
lib/convert-worker.js | 10 +++++++---
lib/substitutions.json | 14 ++++++++++++++
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 136db35..db7eedc 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -598,9 +598,6 @@ function fixMispellings(xml) {
// This is commonly misspelled.
xml = xml.replace(/([Ss])houlderblade/g, "$1houlder blade");
- // Preemptive(ly) is often hyphenated (not always). It should not be.
- xml = xml.replace(/([Pp])re-emptive/g, "$1reemptive");
-
// All dictionaries agree this is capitalized.
xml = xml.replace(/u-turn/g, "U-turn");
@@ -640,6 +637,13 @@ function fixHyphens(xml) {
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
+ // Preemptive(ly) is often hyphenated (not always). It should not be.
+ xml = xml.replace(/([Pp])re-emptive/g, "$1reemptive");
+
+ // These should be hyphenated only when used as a verb. We correct those cases back in substitutions.json.
+ xml = xml.replace(/fist-bump/g, "fist bump");
+ xml = xml.replace(/high-five/g, "high five");
+
// This is usually correct but sometimes wrong.
xml = xml.replace(/neo /g, "neo-");
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 5fe4175..b2ff494 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -6206,6 +6206,10 @@
{
"before": "“Cradle—the most intact part of Tattletale said",
"after": "“Cradle—” the most intact part of Tattletale said"
+ },
+ {
+ "before": "backwards-high five",
+ "after": "backwards high five"
}
],
"https://www.parahumans.net/2019/01/26/blinding-11-9/": [
@@ -7381,6 +7385,11 @@
{
"before": "aunt Rachel",
"after": "Aunt Rachel"
+ },
+ {
+ "before": "for Kenzie to high five",
+ "after": "for Kenzie to high-five",
+ "_comment": "Here it's a verb"
}
],
"https://www.parahumans.net/2019/09/07/from-within-16-8/": [
@@ -8320,6 +8329,11 @@
{
"before": "Almost a Figurehead",
"after": "Almost a figurehead"
+ },
+ {
+ "before": "Can’t fist bump",
+ "after": "Can’t fist-bump",
+ "_comment": "Here it's a verb"
}
],
"https://www.parahumans.net/2020/01/04/infrared-19-3/": [
From a1c7f00b42da4450110928f4d1ad7d1b11da71ff Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 17:05:36 -0500
Subject: [PATCH 15/76] Capitalize "Machine Army"
---
lib/convert-worker.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index db7eedc..f07db96 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -477,6 +477,9 @@ function fixCapitalization(xml, book) {
// The Speedrunners team name is missing its capitalization a couple times.
xml = xml.replace(/speedrunners/g, "Speedrunners");
+ // The Machine Army is missing its capitalization a couple times.
+ xml = xml.replace(/machine army/g, "Machine Army");
+
// "patrol block" is capitalized three different ways: "patrol block", "Patrol block", and "Patrol Block". "patrol
// group" is always lowercased. It seems like "Patrol" is a proper name, and is used as a capitalized modifier in
// other contexts (e.g. Patrol leader). So let's standardize on "Patrol ".
From aa9fc197e9706cae406e78d6bfa411c6e31a8cb5 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 17:11:34 -0500
Subject: [PATCH 16/76] Hyphenate "hand-to-hand"
---
lib/convert-worker.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index f07db96..4faeb16 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -647,6 +647,11 @@ function fixHyphens(xml) {
xml = xml.replace(/fist-bump/g, "fist bump");
xml = xml.replace(/high-five/g, "high five");
+ // This should be hyphenated when used as an adjective (instead of an adverb or noun). I.e. it should be
+ // "hand-to-hand combat", but "passed from hand to hand", and "capable in hand to hand". The following heuristic works
+ // in the books.
+ xml = xml.replace(/hand to hand(?= [a-z])/g, "hand-to-hand");
+
// This is usually correct but sometimes wrong.
xml = xml.replace(/neo /g, "neo-");
From 6ddde0681720b43af7e65b6c15cb6223b70cff34 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 17:16:05 -0500
Subject: [PATCH 17/76] De-capitalize "parahumans"
---
lib/substitutions.json | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/lib/substitutions.json b/lib/substitutions.json
index b2ff494..6e1df8c 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -124,6 +124,10 @@
{
"before": "Really dad",
"after": "Really Dad"
+ },
+ {
+ "before": "The Parahumans wiki",
+ "after": "The parahumans wiki"
}
],
"https://parahumans.wordpress.com/2011/08/09/agitation-3-1/": [
@@ -2529,6 +2533,10 @@
{
"before": "weeks, months. Anticipating",
"after": "weeks, months. Anticipating"
+ },
+ {
+ "before": "as much or more about Parahumans than",
+ "after": "as much or more about parahumans than"
}
],
"https://parahumans.wordpress.com/2013/01/08/migration-17-1/": [
@@ -2776,6 +2784,10 @@
{
"before": "that was why Masters tend to be",
"after": "that was why masters tend to be"
+ },
+ {
+ "before": "the top researchers on Parahumans",
+ "after": "the top researchers on parahumans"
}
],
"https://parahumans.wordpress.com/2013/02/07/interlude-18-donation-bonus-3/": [
@@ -5196,6 +5208,10 @@
{
"before": "fighting, ‘rene",
"after": "fighting, ’rene"
+ },
+ {
+ "before": "I studied Parahumans before",
+ "after": "I studied parahumans before"
}
],
"https://www.parahumans.net/2018/06/26/torch-interlude-7-x/": [
@@ -5717,6 +5733,10 @@
{
"before": "fucking teacher wouldn’t",
"after": "fucking Teacher wouldn’t"
+ },
+ {
+ "before": "That the Parahumans were taking over",
+ "after": "That the parahumans were taking over"
}
],
"https://www.parahumans.net/2018/10/13/gleaming-9-15/": [
@@ -6822,6 +6842,12 @@
"after": "Instead a 1, −2, 4"
}
],
+ "https://www.parahumans.net/2019/05/21/breaking-14-2/": [
+ {
+ "before": "if Parahumans like Swansong",
+ "after": "if parahumans like Swansong"
+ }
+ ],
"https://www.parahumans.net/2019/05/25/breaking-14-3/": [
{
"before": "actively tamper with it it",
@@ -8334,6 +8360,10 @@
"before": "Can’t fist bump",
"after": "Can’t fist-bump",
"_comment": "Here it's a verb"
+ },
+ {
+ "before": "that other Parahumans are",
+ "after": "that other parahumans are"
}
],
"https://www.parahumans.net/2020/01/04/infrared-19-3/": [
From 877beda7332b74570b653873d3b07ef61481392e Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 19 Dec 2020 17:21:59 -0500
Subject: [PATCH 18/76] 4.8.0
---
npm-shrinkwrap.json | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index b997681..748555a 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -1,6 +1,6 @@
{
"name": "worm-scraper",
- "version": "4.7.0",
+ "version": "4.8.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 80f362f..7437398 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"parahuman",
"scraper"
],
- "version": "4.7.0",
+ "version": "4.8.0",
"author": "Domenic Denicola (https://domenic.me/)",
"license": "WTFPL",
"repository": "domenic/worm-scraper",
From 6f51bc6c9a7296c8b2790eecf8b02e4d7bfcdfb6 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Thu, 24 Dec 2020 21:22:37 -0500
Subject: [PATCH 19/76] Spot fixes for Ward through Infrared 19.8
---
lib/convert-worker.js | 2 +
lib/substitutions.json | 106 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 108 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 4faeb16..774a772 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -424,6 +424,8 @@ function enDashJointNames(xml) {
xml = xml.replace(/Crawler-Breed/g, "Crawler–Breed");
xml = xml.replace(/Simurgh-Myrddin-plant/g, "Simurgh–Myrddin–plant");
xml = xml.replace(/Armsmaster-Defiant/g, "Armsmaster–Defiant");
+ xml = xml.replace(/Matryoshka-Valentin/g, "Matryoshka–Valentin");
+ xml = xml.replace(/Gaea-Eden/g, "Gaea–Eden");
xml = xml.replace(/([Aa])gent-parahuman/g, "$1gent–parahuman");
xml = xml.replace(/([Pp])arahuman-agent/g, "$1arahuman–agent");
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 6e1df8c..1ffed4a 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -7950,6 +7950,10 @@
{
"regExp": "titan(?![a-z])",
"replacement": "Titan"
+ },
+ {
+ "before": "the Fallen Raid or the Prison?",
+ "after": "the Fallen raid or the prison?"
}
],
"https://www.parahumans.net/2019/11/19/radiation-18-2/": [
@@ -8446,6 +8450,14 @@
{
"before": "can understand your Aunt and Uncle",
"after": "can understand your aunt and uncle"
+ },
+ {
+ "before": "—And I think I have a grasp",
+ "after": "—and I think I have a grasp"
+ },
+ {
+ "before": "emotion driven",
+ "after": "emotion-driven"
}
],
"https://www.parahumans.net/2020/01/14/infrared-19-c/": [
@@ -8464,6 +8476,24 @@
{
"before": "—die quickly, if he has to die.",
"after": "—die quickly, if he has to die."
+ },
+ {
+ "before": "close mouthed",
+ "after": "close-mouthed"
+ },
+ {
+ "before": "“…Don’t really trust",
+ "after": "“…don’t really trust"
+ }
+ ],
+ "https://www.parahumans.net/2020/01/18/infrared-19-5/": [
+ {
+ "before": "liqud Titan",
+ "after": "liquid Titan"
+ },
+ {
+ "before": "done at the Prison",
+ "after": "done at the prison"
}
],
"https://www.parahumans.net/2020/01/21/infrared-19-6/": [
@@ -8482,24 +8512,96 @@
{
"before": "‘fragile one’",
"after": "‘Fragile One’"
+ },
+ {
+ "before": "“—But there won’t be any effects",
+ "after": "“—but there won’t be any effects"
+ },
+ {
+ "before": "One of his Titans lurked",
+ "after": "One of his giants lurked"
+ },
+ {
+ "before": "furously",
+ "after": "furiously"
+ },
+ {
+ "before": "what I’d looked, hadn’t registered",
+ "after": "what I’d looked at, hadn’t registered"
+ },
+ {
+ "before": "Mother Titan",
+ "after": "Mother Giant"
+ },
+ {
+ "before": "Adrenline",
+ "after": "Adrenaline"
+ },
+ {
+ "before": "ex-Prison",
+ "after": "ex-prison"
+ },
+ {
+ "before": "Chris and the Syringe",
+ "after": "Chris and the syringe"
+ },
+ {
+ "before": "“…She might have gotten",
+ "after": "“…she might have gotten"
+ },
+ {
+ "before": "“—It was Jessica accepting",
+ "after": "“—it was Jessica accepting"
+ },
+ {
+ "before": "We saw people running around.",
+ "after": "We saw people running around.”"
}
],
"https://www.parahumans.net/2020/01/25/infrared-19-d/": [
{
"before": "look after mom",
"after": "look after Mom"
+ },
+ {
+ "before": "pink-a line of red-pink",
+ "after": "pink—a line of red—pink"
+ },
+ {
+ "before": "recruited for busy work",
+ "after": "recruited for busywork"
+ },
+ {
+ "before": "Steamwheel went Rogue",
+ "after": "Steamwheel went rogue"
+ },
+ {
+ "before": "mother said. Such a horrible",
+ "after": "mother said. “Such a horrible"
}
],
"https://www.parahumans.net/2020/01/28/infrared-19-e/": [
{
"before": "so mom doesn’t end up alone",
"after": "so Mom doesn’t end up alone"
+ },
+ {
+ "before": "“No!” she was almost drowned out",
+ "after": "“No!” She was almost drowned out"
}
],
"https://www.parahumans.net/2020/02/02/infrared-19-7/": [
{
"before": "I really wasn’t. really",
"after": "I really wasn’t. Really"
+ },
+ {
+ "before": "‘I have that and ‘I don’t want it’",
+ "after": "‘I have that and I don’t want it’"
+ },
+ {
+ "before": "number boy",
+ "after": "Number Boy"
}
],
"https://www.parahumans.net/2020/02/04/infrared-19-8/": [
@@ -8510,6 +8612,10 @@
{
"before": "relatively speaking” Number Five",
"after": "relatively speaking,” Number Five"
+ },
+ {
+ "before": "Skitter, Khepri",
+ "after": "Skitter, Khepri"
}
],
"https://www.parahumans.net/2020/02/08/infrared-19-9/": [
From bf8a1b325c5bcf482408770b2167537ef4134753 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 15:42:12 -0500
Subject: [PATCH 20/76] Hyphenate self-preservation
---
lib/convert-worker.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 774a772..63576f7 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -628,7 +628,6 @@ function fixHyphens(xml) {
xml = xml.replace(/ haired/g, "-haired");
// These are consistently missing hyphens.
- xml = xml.replace(/self destruct/g, "self-destruct");
xml = xml.replace(/life threatening/g, "life-threatening");
xml = xml.replace(/hard headed/g, "hard-headed");
xml = xml.replace(/shoulder mounted/g, "shoulder-mounted");
@@ -638,7 +637,7 @@ function fixHyphens(xml) {
xml = xml.replace(/able bodied/g, "able-bodied");
xml = xml.replace(/level headed/g, "level-headed");
xml = xml.replace(/clear cut/g, "clear-cut");
- xml = xml.replace(/self (conscious|esteem|loathing|harm)/g, "self-$1");
+ xml = xml.replace(/self (conscious|esteem|loathing|harm|destruct|preservation)/g, "self-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
From 6256b332cbcadeedde50e1c11ed7fcbfdb516c38 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 15:44:35 -0500
Subject: [PATCH 21/76] Apply hyphenation fixes even to capitalized phrases
---
lib/convert-worker.js | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 63576f7..9d851a6 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -628,18 +628,18 @@ function fixHyphens(xml) {
xml = xml.replace(/ haired/g, "-haired");
// These are consistently missing hyphens.
- xml = xml.replace(/life threatening/g, "life-threatening");
- xml = xml.replace(/hard headed/g, "hard-headed");
- xml = xml.replace(/shoulder mounted/g, "shoulder-mounted");
- xml = xml.replace(/golden skinned/g, "golden-skinned");
- xml = xml.replace(/creepy crawl/g, "creepy-crawl");
- xml = xml.replace(/well armed/g, "well-armed");
- xml = xml.replace(/able bodied/g, "able-bodied");
- xml = xml.replace(/level headed/g, "level-headed");
- xml = xml.replace(/clear cut/g, "clear-cut");
- xml = xml.replace(/self (conscious|esteem|loathing|harm|destruct|preservation)/g, "self-$2");
+ xml = xml.replace(/([Ll]ife) threatening/g, "life-threatening");
+ xml = xml.replace(/([Hh]ard) headed/g, "$1-headed");
+ xml = xml.replace(/([Ss]houlder) mounted/g, "$1-mounted");
+ xml = xml.replace(/([Gg]olden) skinned/g, "$1-skinned");
+ xml = xml.replace(/([Cc]reepy) crawl/g, "$1-crawl");
+ xml = xml.replace(/([Ww]ell) armed/g, "$1-armed");
+ xml = xml.replace(/([Aa]ble) bodied/g, "$1-bodied");
+ xml = xml.replace(/([Ll]evel) headed/g, "$1-headed");
+ xml = xml.replace(/([Cc]lear) cut/g, "$1-cut");
+ xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
- xml = xml.replace(/(?<=\b)one on one(?=\b)/g, "one-on-one");
+ xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
// Preemptive(ly) is often hyphenated (not always). It should not be.
xml = xml.replace(/([Pp])re-emptive/g, "$1reemptive");
From 294cbb2e718c596aecf3d4064cdce2852d196332 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 15:46:36 -0500
Subject: [PATCH 22/76] Hyphenate "vat-grown"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 9d851a6..1b49329 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -637,6 +637,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Aa]ble) bodied/g, "$1-bodied");
xml = xml.replace(/([Ll]evel) headed/g, "$1-headed");
xml = xml.replace(/([Cc]lear) cut/g, "$1-cut");
+ xml = xml.replace(/([Vv]at) grown/g, "$1-grown");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From 44f2cc3c7beef87c4734bd62168d956a33d89c04 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 15:48:00 -0500
Subject: [PATCH 23/76] Hyphenate "shell-shocked"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1b49329..30add8e 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -638,6 +638,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Ll]evel) headed/g, "$1-headed");
xml = xml.replace(/([Cc]lear) cut/g, "$1-cut");
xml = xml.replace(/([Vv]at) grown/g, "$1-grown");
+ xml = xml.replace(/([Ss]hell) shocked/g, "$1-shocked");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From 651944b4da0c80a6fd0923165fedcd98c28eea4b Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 15:56:24 -0500
Subject: [PATCH 24/76] Hyphenate "second-guess" and derivatives, when
appropriate
---
lib/convert-worker.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 30add8e..11ed960 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -655,6 +655,10 @@ function fixHyphens(xml) {
// in the books.
xml = xml.replace(/hand to hand(?= [a-z])/g, "hand-to-hand");
+ // This is usually wrong but sometimes correct. The lookarounds avoid specific cases where it's referring to an actual
+ // second in a series of guesses.
+ xml = xml.replace(/(?
Date: Fri, 25 Dec 2020 15:59:20 -0500
Subject: [PATCH 25/76] Hyphenate "built-in" when appropriate
---
lib/substitutions.json | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 1ffed4a..d8de61a 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -4422,6 +4422,10 @@
{
"before": "How do you even think rec—how do you think",
"after": "How do you even think rec— How do you think"
+ },
+ {
+ "before": "built in protections",
+ "after": "built-in protections"
}
],
"https://www.parahumans.net/2017/12/01/daybreak-1-8/": [
@@ -4494,6 +4498,10 @@
{
"before": "She huffed out out a small",
"after": "She huffed out a small"
+ },
+ {
+ "before": "a built in glare",
+ "after": "a built-in glare"
}
],
"https://www.parahumans.net/2017/12/30/flare-2-7/": [
@@ -6662,6 +6670,12 @@
"after": "“It’s winter,”"
}
],
+ "https://www.parahumans.net/2019/04/05/black-13-2/": [
+ {
+ "before": "built in protection",
+ "after": "built-in protection"
+ }
+ ],
"https://www.parahumans.net/2019/04/09/black-13-3/": [
{
"before": "you have have surmised",
@@ -8616,6 +8630,10 @@
{
"before": "Skitter, Khepri",
"after": "Skitter, Khepri"
+ },
+ {
+ "before": "built in spears",
+ "after": "built-in spears"
}
],
"https://www.parahumans.net/2020/02/08/infrared-19-9/": [
From e1b59994f8d8b0ec392b73dcbea5977cc21ab22e Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 16:01:21 -0500
Subject: [PATCH 26/76] Capitalize "Uncle Neil" and "Aunt Fleur"
---
lib/convert-worker.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 11ed960..2c11cd1 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -559,8 +559,10 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/(?
Date: Fri, 25 Dec 2020 16:03:23 -0500
Subject: [PATCH 27/76] Hyphenate "dog-tired"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 2c11cd1..8506a0f 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -641,6 +641,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Cc]lear) cut/g, "$1-cut");
xml = xml.replace(/([Vv]at) grown/g, "$1-grown");
xml = xml.replace(/([Ss]hell) shocked/g, "$1-shocked");
+ xml = xml.replace(/([Dd]og) tired/g, "$1-tired");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From 369714f3d15dac7e5b403cadf085caafc1989a4e Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 17:32:28 -0500
Subject: [PATCH 28/76] Spot fixes for Ward through Infrared 19.10
---
lib/substitutions.json | 52 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/lib/substitutions.json b/lib/substitutions.json
index d8de61a..92f7ff9 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -3949,6 +3949,10 @@
{
"before": "this,” I said. “I",
"after": "this,” I said, “I"
+ },
+ {
+ "before": "Second Triggers",
+ "after": "Second triggers"
}
],
"https://parahumans.wordpress.com/2013/10/05/venom-29-8/": [
@@ -8652,6 +8656,22 @@
{
"before": "my Uncle said",
"after": "my uncle said"
+ },
+ {
+ "before": "Anywhere else?",
+ "after": "Anywhere else?"
+ },
+ {
+ "before": "do you understand about Trigger events",
+ "after": "do you understand about trigger events"
+ },
+ {
+ "before": "good day,” my mother said, “The best",
+ "after": "good day,” my mother said, “the best"
+ },
+ {
+ "before": "happen to you,” My mother said",
+ "after": "happen to you,” my mother said"
}
],
"https://www.parahumans.net/2020/02/11/infrared-19-f/": [
@@ -8662,6 +8682,30 @@
{
"before": "while mom did her own thing",
"after": "while Mom did her own thing"
+ },
+ {
+ "before": "still hadn’t been repeated from the fights",
+ "after": "still hadn’t been repaired from the fights"
+ },
+ {
+ "before": "“Hey!” the girl turned",
+ "after": "“Hey!” The girl turned"
+ },
+ {
+ "before": "Lookout, How long do you need",
+ "after": "Lookout, how long do you need"
+ },
+ {
+ "before": "You guy should know",
+ "after": "You guys should know"
+ },
+ {
+ "before": "he’d gotten more of dad",
+ "after": "he’d gotten more of Dad"
+ },
+ {
+ "before": "Its Capricorn",
+ "after": "It’s Capricorn"
}
],
"https://www.parahumans.net/2020/02/15/infrared-19-10/": [
@@ -8676,6 +8720,14 @@
{
"before": "figure out while she was gone. we’ll see who",
"after": "figure out while she was gone. We’ll see who"
+ },
+ {
+ "before": "miligram",
+ "after": "milligram"
+ },
+ {
+ "before": "same clothes that had been issues to the refugees",
+ "after": "same clothes that had been issued to the refugees"
}
],
"https://www.parahumans.net/2020/02/18/infrared-19-g/": [
From d0c23d86fd64ed9a7b80341b74cd6371304c44ee Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 17:37:00 -0500
Subject: [PATCH 29/76] Hyphenate "a just-in-case"
---
lib/convert-worker.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 8506a0f..b7e4760 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -662,6 +662,10 @@ function fixHyphens(xml) {
// second in a series of guesses.
xml = xml.replace(/(?
Date: Fri, 25 Dec 2020 17:45:48 -0500
Subject: [PATCH 30/76] De-capitalize judo, aikido, karate, and tae kwon do
---
lib/convert-worker.js | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index b7e4760..0e3bcda 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -496,9 +496,16 @@ function fixCapitalization(xml, book) {
// This is sometimes missing its capitalization.
xml = xml.replace(/the birdcage/g, "the Birdcage");
- // There's no reason why these should be capitalized. (Note that they never appear at the beginning of any sentences.)
- xml = xml.replace(/Halberd/g, "halberd");
- xml = xml.replace(/Loft/g, "loft");
+ // There's no reason why these should be capitalized.
+ xml = xml.replace(/(?
Date: Fri, 25 Dec 2020 17:53:31 -0500
Subject: [PATCH 31/76] Hyphenate "face-to-face" when appropriate
---
lib/convert-worker.js | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 0e3bcda..1e6c0df 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -673,6 +673,11 @@ function fixHyphens(xml) {
// noun cases are missing one or both hyphens.
xml = xml.replace(/([Aa]) just[ -]in case/g, "$1 just-in-case");
+ // When used as an adjective, it's hyphenated. It turns out most cases are as an adverb, so we go with this approach:
+ xml = xml.replace(
+ /face to face(?= meeting| hang-out| interaction| contact| conversation| confrontation| fight)/g,
+ "face-to-face");
+
// This is usually correct but sometimes wrong.
xml = xml.replace(/neo /g, "neo-");
From 26a2b9c9b54c58f7600c452105231a52c6a6870c Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Fri, 25 Dec 2020 18:07:06 -0500
Subject: [PATCH 32/76] Hyphenate "fight or flight" when appropriate
---
lib/convert-worker.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1e6c0df..b7904bf 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -678,6 +678,9 @@ function fixHyphens(xml) {
/face to face(?= meeting| hang-out| interaction| contact| conversation| confrontation| fight)/g,
"face-to-face");
+ // When used as an adjective, it's hyphenated. This heuristic works in the books.
+ xml = xml.replace(/fight or flight(?= [a-z])/g, "fight-or-flight");
+
// This is usually correct but sometimes wrong.
xml = xml.replace(/neo /g, "neo-");
From b652e3812bdb0965cffcf604dfb6e1c7f2e78445 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 15:09:14 -0500
Subject: [PATCH 33/76] De-capitalize "flock" to match prevailing usage
---
lib/convert-worker.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index b7904bf..1e3558b 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -471,7 +471,7 @@ function fixCapitalization(xml, book) {
// This occurs enough times it's better to do here than in one-off fixes. We correct the single instance where
// it's incorrect to capitalize in the one-off fixes.
// Note that Ward contains much talk of "the clairvoyants", so we don't want to capitalize plurals.
- xml = xml.replace(/([Tt])he clairvoyant([^s])/g, "$1he Clairvoyant$2");
+ xml = xml.replace(/([Tt])he clairvoyant(?!s)/g, "$1he Clairvoyant");
// ReSound's name is sometimes miscapitalized. The word is never used in a non-name context.
xml = xml.replace(/Resound/g, "ReSound");
@@ -518,6 +518,11 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/Radiata/g, "radiata");
xml = xml.replace(/Gemma/g, "gemma");
+ // We de-capitalize Valkyrie's "flock", since most uses are de-capitalized (e.g. the many instances in Gleaming
+ // Interlude 9, or Dying 15.z). This is a bit surprising; it seems like an organization name. But I guess it's
+ // informal.
+ xml = xml.replace(/(?
Date: Sat, 26 Dec 2020 15:35:31 -0500
Subject: [PATCH 34/76] De-capitalize "giants" but capitalize "X Giant"
---
lib/convert-worker.js | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 1e3558b..390deac 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -497,23 +497,23 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/the birdcage/g, "the Birdcage");
// There's no reason why these should be capitalized.
- xml = xml.replace(/(?)Halberd/g, "halberd");
+ xml = xml.replace(/(?)Loft/g, "loft");
// These are treated as common nouns and not traditionally capitalized. "Krav Maga" remains capitalized,
// interestingly (according to dictionaries and Wikipedia).
- xml = xml.replace(/(?)Judo/g, "judo");
+ xml = xml.replace(/(?)Aikido/g, "aikido");
+ xml = xml.replace(/(?)Karate/g, "karate");
+ xml = xml.replace(/(?)Tae Kwon Do/g, "tae kwon do");
// There's no reason why university should be capitalized in most contexts, although sometimes it's used as part of
// a compound noun or at the beginning of a sentence.
- xml = xml.replace(/(?|Cornell |Nilles )University(?! Road)/, "university");
// Organ names (e.g. brain, arm) or scientific names are not capitalized, so the "corona pollentia" and friends should
// not be either. The books are inconsistent.
- xml = xml.replace(/(?|-)Corona/g, "corona");
xml = xml.replace(/Pollentia/g, "pollentia");
xml = xml.replace(/Radiata/g, "radiata");
xml = xml.replace(/Gemma/g, "gemma");
@@ -521,7 +521,7 @@ function fixCapitalization(xml, book) {
// We de-capitalize Valkyrie's "flock", since most uses are de-capitalized (e.g. the many instances in Gleaming
// Interlude 9, or Dying 15.z). This is a bit surprising; it seems like an organization name. But I guess it's
// informal.
- xml = xml.replace(/(?)Flock/g, "flock");
// Especially early in Worm, PRT designations are capitalized; they should not be. This fixes the cases where we
// can be reasonably sure they don't start a sentence, although more specific instances are done in
@@ -533,7 +533,7 @@ function fixCapitalization(xml, book) {
// This also over-de-capitalizes "The Stranger" in Ward (a titan name). Those also get fixed in substitutions.json.
xml = xml.replace(
// eslint-disable-next-line max-len
- /(?|“|\n|: )(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)(?! [A-Z])/g,
+ /(?|\n|: )(Mover|Shaker|Brute|Breaker|Tinker|Blaster|Thinker|Striker|Changer|Trump|Stranger|Shifter|Shaper)(?! [A-Z])/g,
(_, designation) => designation.toLowerCase()
);
xml = xml.replace(
@@ -610,6 +610,11 @@ function fixCapitalization(xml, book) {
xml = xml.replace(/Kronos titan/g, "Kronos Titan");
}
+ // For the giants, the prevailing usage seems to be to keep the term lowercase, but capitalize when used as a name.
+ xml = xml.replace(/(?<=Mathers |Goddess )giant/g, "Giant");
+ xml = xml.replace(/mother giant/ig, "Mother Giant");
+ xml = xml.replace(/(?)Giants/g, "giants");
+
return xml;
}
From 08e0d0d9a851263873b2e49b0a12a2a443a4f805 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 15:39:39 -0500
Subject: [PATCH 35/76] De-italicize some commas
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 390deac..2dbdb32 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -209,6 +209,7 @@ function getBodyXML(chapter, book, contentEl) {
xml = xml.replace(/,”<\/p>/g, ".”");
xml = xml.replace(/(.*),<\/p>/g, "
$1.
");
xml = xml.replace(/‘(\w+)‘(\w+)’/g, "‘$1’$2’");
+ xml = xml.replace(/([a-z]+), ([a-z]+)<\/em>/g, "$1, $2");
// Similar problems occur in Ward with and as do in Worm with s
xml = xml.replace(//g, "");
From f5f0ba8e61b51ddf1635bca81e501951ae79c4f9 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:20:31 -0500
Subject: [PATCH 36/76] Spot fixes for Ward through Last 20.end
---
lib/convert-worker.js | 1 +
lib/substitutions.json | 274 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 273 insertions(+), 2 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 2dbdb32..030d689 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -660,6 +660,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Vv]at) grown/g, "$1-grown");
xml = xml.replace(/([Ss]hell) shocked/g, "$1-shocked");
xml = xml.replace(/([Dd]og) tired/g, "$1-tired");
+ xml = xml.replace(/([Nn]ightmare) filled/g, "$1-filled");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
diff --git a/lib/substitutions.json b/lib/substitutions.json
index 92f7ff9..991f542 100644
--- a/lib/substitutions.json
+++ b/lib/substitutions.json
@@ -3667,6 +3667,10 @@
{
"before": "Focus Memorize.",
"after": "Focus. Memorize."
+ },
+ {
+ "before": "The Entity slowed",
+ "after": "The entity slowed"
}
],
"https://parahumans.wordpress.com/2013/08/13/extinction-27-1/": [
@@ -8734,6 +8738,14 @@
{
"before": "Imp and the heartbroken",
"after": "Imp and the Heartbroken"
+ },
+ {
+ "before": "That’s the way it always goes I get close to people",
+ "after": "That’s the way it always goes—I get close to people"
+ },
+ {
+ "before": "The voices, a veritable crowd, was audible now",
+ "after": "The voices, a veritable crowd, were audible now"
}
],
"https://www.parahumans.net/2020/02/23/infrared-19-z/": [
@@ -8744,18 +8756,141 @@
{
"before": "pink and black titan",
"after": "pink and black Titan"
+ },
+ {
+ "before": "throguh",
+ "after": "through"
}
],
"https://www.parahumans.net/2020/02/25/last-20-1/": [
{
"before": "across this clearing. eyes, cameras",
"after": "across this clearing. Eyes, cameras"
+ },
+ {
+ "before": "monsters, and to use the phrasing he liked",
+ "after": "monsters, to use the phrasing he liked"
+ },
+ {
+ "before": "about giving short speeches. I couldn’t help",
+ "after": "about giving short speeches, I couldn’t help"
+ },
+ {
+ "before": "this Endbringer that wasn’t brutish and noisy",
+ "after": "this Endbringer wasn’t brutish and noisy"
+ },
+ {
+ "before": "like a dance with wings",
+ "after": "like a dancer with wings"
+ },
+ {
+ "before": "a gravely sound",
+ "after": "a gravelly sound"
+ },
+ {
+ "before": "trying to remain peripherally aware of.",
+ "after": "trying to remain peripherally aware."
+ },
+ {
+ "before": "The scream, the fact was",
+ "after": "The scream, the fact we"
+ },
+ {
+ "before": "The water receded before tsunami",
+ "after": "The water receded before a tsunami"
+ },
+ {
+ "before": "Stay the course!",
+ "after": "Stay the course!”"
+ }
+ ],
+ "https://www.parahumans.net/2020/02/29/last-20-2/": [
+ {
+ "before": "Go!",
+ "after": "Go!"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/03/last-20-3/": [
+ {
+ "before": "Get-between the words",
+ "after": "Get——between the words"
}
],
"https://www.parahumans.net/2020/03/07/last-20-4/": [
{
"before": "peace!” Cryptid growled",
"after": "peace!” Cryptid growled"
+ },
+ {
+ "before": "I’m going crazy,” Sveta remarked. “It’s you",
+ "after": "I’m going crazy,” Sveta remarked, “it’s you"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/10/last-20-5/": [
+ {
+ "before": "“…It’s slipping through our",
+ "after": "“…it’s slipping through our"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/15/last-20-6/": [
+ {
+ "before": "Strikes, brutes, breakers",
+ "after": "Strikers, brutes, breakers"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/17/last-20-7/": [
+ {
+ "before": "the pain in the ass heroine",
+ "after": "the pain-in-the-ass heroine"
+ },
+ {
+ "before": "manton limit",
+ "after": "Manton limit"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/21/last-20-8/": [
+ {
+ "before": "For Humanity?",
+ "after": "For humanity?"
+ },
+ {
+ "before": "a plan for Endgame",
+ "after": "a plan for endgame"
+ },
+ {
+ "before": "Saturday Morning cartoon",
+ "after": "Saturday-morning cartoon",
+ "_comment": "https://en.wikipedia.org/wiki/Saturday-morning_cartoon"
+ },
+ {
+ "before": "Simurgh driven future",
+ "after": "Simurgh-driven future"
+ },
+ {
+ "before": "the Entities",
+ "after": "the entities"
+ }
+ ],
+ "https://www.parahumans.net/2020/03/25/last-20-9/": [
+ {
+ "before": "you could help miss—help Antares",
+ "after": "you could help Miss—help Antares"
+ },
+ {
+ "before": "Did I scare him?",
+ "after": "Did I scare him?"
+ },
+ {
+ "regExp": "nurse Leah",
+ "replacement": "Nurse Leah"
+ },
+ {
+ "before": "“…But I have to draw",
+ "after": "“…but I have to draw"
+ },
+ {
+ "before": "break Capricorn’s parents hearts",
+ "after": "break Capricorn’s parents’ hearts"
}
],
"https://www.parahumans.net/2020/03/31/last-20-10/": [
@@ -8764,32 +8899,139 @@
"after": "shaping it as it rolled out. It became a circular"
}
],
+ "https://www.parahumans.net/2020/04/04/last-20-b/": [
+ {
+ "before": "Aurora Borealis",
+ "after": "aurora borealis"
+ },
+ {
+ "before": "the snow fall and",
+ "after": "the snowfall and"
+ },
+ {
+ "before": "the more boy crazy girls",
+ "after": "the more boy-crazy girls"
+ },
+ {
+ "before": "hostage with us, too!",
+ "after": "hostage with us, too!"
+ },
+ {
+ "before": "done, prez",
+ "after": "done, Prez"
+ },
+ {
+ "before": "The—-bye.",
+ "after": "The——bye."
+ },
+ {
+ "before": "who would gave gone after",
+ "after": "who would have gone after"
+ },
+ {
+ "before": "a problem?” Her dad asked",
+ "after": "a problem?” her dad asked"
+ },
+ {
+ "before": "her fathers hand",
+ "after": "her father’s hand"
+ }
+ ],
"https://www.parahumans.net/2020/04/07/last-20-11/": [
{
- "before": "had harangued the P.R.T., even",
- "after": "had harangued the PRT, even"
+ "before": "had harangued the P.R.T., even though the Patrol had",
+ "after": "had harangued the PRT, even though the patrol had"
},
{
"before": "“Actually,” Tattletale said. “I’ve been going",
"after": "“Actually,” Tattletale said, “I’ve been going"
+ },
+ {
+ "before": "It’s not hell either",
+ "after": "It’s not Hell either"
+ },
+ {
+ "before": "damocles",
+ "after": "Damocles"
+ }
+ ],
+ "https://www.parahumans.net/2020/04/11/last-20-e1/": [
+ {
+ "before": "newly formed Protectorate",
+ "after": "newly-formed Protectorate"
+ },
+ {
+ "before": "looked out over the city, and feeling shock",
+ "after": "looked out over the city, and felt shock"
+ }
+ ],
+ "https://www.parahumans.net/2020/04/14/last-20-e2/": [
+ {
+ "before": "a few years where father felt like",
+ "after": "a few years where Father felt like"
+ },
+ {
+ "before": "“—And the escaped prisoners",
+ "after": "“—and the escaped prisoners"
+ },
+ {
+ "before": "case by case basis",
+ "after": "case-by-case basis"
}
],
"https://www.parahumans.net/2020/04/18/last-20-e3/": [
{
"before": "madness inducing years of isolation",
"after": "madness-inducing years of isolation"
+ },
+ {
+ "before": "Finale! Now!",
+ "after": "Finale! Now!"
}
],
"https://www.parahumans.net/2020/04/21/last-20-e4/": [
{
"before": "grown around the the maille sheath",
"after": "grown around the maille sheath"
+ },
+ {
+ "before": "the size of a deserted earth",
+ "after": "the size of a deserted Earth"
}
],
"https://www.parahumans.net/2020/04/25/last-20-e5/": [
{
"before": "She has has some past therapy",
"after": "She has had some past therapy"
+ },
+ {
+ "before": "It was a sunny spring",
+ "after": "
It was a sunny spring"
+ },
+ {
+ "before": "living like a king.
",
+ "after": "living like a king."
+ },
+ {
+ "before": "dont’",
+ "after": "don’t"
+ },
+ {
+ "before": "its a nightmare I know",
+ "after": "it’s a nightmare I know"
+ },
+ {
+ "before": "what to do.”\n“Imp was saying Lookout",
+ "after": "what to do.
\n“Imp was saying Lookout",
+ "_comment": "https://english.stackexchange.com/q/2288/242244"
+ },
+ {
+ "before": "listening, lost in tinkering—
",
+ "after": "listening, lost in tinkering—”"
+ },
+ {
+ "before": ":Transmit
\nI’ve got",
+ "after": ":Transmit
I’ve got"
}
],
"https://www.parahumans.net/2020/04/28/last-20-e6/": [
@@ -8812,6 +9054,22 @@
{
"before": "Back to mom",
"after": "Back to Mom"
+ },
+ {
+ "before": "Gold morning",
+ "after": "Gold Morning"
+ },
+ {
+ "before": "pay it safe",
+ "after": "play it safe"
+ },
+ {
+ "before": "“—You’ll want to pass on",
+ "after": "“—you’ll want to pass on"
+ },
+ {
+ "before": "cross the Ocean",
+ "after": "cross the ocean"
}
],
"https://www.parahumans.net/?p=3365&preview=true": [
@@ -8846,6 +9104,18 @@
{
"before": "with black slacks. his hair was chin",
"after": "with black slacks. His hair was chin"
+ },
+ {
+ "before": "human right’s abuses",
+ "after": "human rights abuses"
+ },
+ {
+ "before": "‘us‘",
+ "after": "‘us’"
+ },
+ {
+ "before": "captain Gaile",
+ "after": "Captain Gaile"
}
]
}
From 0b4af123ab760b0d8c72a4e0c5ddd4391a71477b Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:23:03 -0500
Subject: [PATCH 37/76] Hyphenate "one-sided"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 030d689..24d6b56 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -661,6 +661,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Ss]hell) shocked/g, "$1-shocked");
xml = xml.replace(/([Dd]og) tired/g, "$1-tired");
xml = xml.replace(/([Nn]ightmare) filled/g, "$1-filled");
+ xml = xml.replace(/([Oo]ne) sided/g, "$1-sided");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From f3366e834690869fc59611fa7b176761b883983e Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:28:36 -0500
Subject: [PATCH 38/76] Hyphenate "medium-sized"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 24d6b56..3fefb13 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -662,6 +662,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Dd]og) tired/g, "$1-tired");
xml = xml.replace(/([Nn]ightmare) filled/g, "$1-filled");
xml = xml.replace(/([Oo]ne) sided/g, "$1-sided");
+ xml = xml.replace(/([Mm]edium) sized/g, "$1-sized");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From 5a25df658b0322ca12cb590b7396966665b2e66c Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:31:44 -0500
Subject: [PATCH 39/76] Hyphenate "teary-eyed"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 3fefb13..a271a5a 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -663,6 +663,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Nn]ightmare) filled/g, "$1-filled");
xml = xml.replace(/([Oo]ne) sided/g, "$1-sided");
xml = xml.replace(/([Mm]edium) sized/g, "$1-sized");
+ xml = xml.replace(/([Tt]eary) eyed/g, "$1-eyed");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From 89789724d176911f7a1b7f74de80c915e3c73a0b Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:34:26 -0500
Subject: [PATCH 40/76] Hyphenate "worst-case scenario"
---
lib/convert-worker.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index a271a5a..5b9602d 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -664,6 +664,7 @@ function fixHyphens(xml) {
xml = xml.replace(/([Oo]ne) sided/g, "$1-sided");
xml = xml.replace(/([Mm]edium) sized/g, "$1-sized");
xml = xml.replace(/([Tt]eary) eyed/g, "$1-eyed");
+ xml = xml.replace(/([Ww]orst) case scenario/g, "$1-case scenario");
xml = xml.replace(/([Ss]elf) (conscious|esteem|loathing|harm|destruct|preservation)/g, "$1-$2");
xml = xml.replace(/([Oo]ne|[Tt]wo|[Tt]hree|[Ff]our|[Ff]ourth) dimensional/g, "$1-dimensional");
xml = xml.replace(/(?<=\b)([Oo]ne) on one(?=\b)/g, "$1-on-one");
From a89414392ef6c6bc53a6b60b062c32092cd46cf7 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:38:42 -0500
Subject: [PATCH 41/76] Fix some em dashes in Ward Last 20.e5
---
lib/convert-worker.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/convert-worker.js b/lib/convert-worker.js
index 5b9602d..5b1f4a0 100644
--- a/lib/convert-worker.js
+++ b/lib/convert-worker.js
@@ -383,11 +383,12 @@ function fixEmDashes(xml) {
xml = xml.replace(/“((?:)?)-/g, "“$1—");
xml = xml.replace(/-[,.]?”/g, "—”");
xml = xml.replace(/-(!|\?)”/g, "—$1”");
- xml = xml.replace(/-[,.]?<\/em>”/g, "—”");
+ xml = xml.replace(/-[,.]?<\/([a-z]+)>”/g, "—$1>”");
xml = xml.replace(/-“/g, "—”");
xml = xml.replace(/-/g, "
—");
xml = xml.replace(/-<\/p>/g, "—
");
- xml = xml.replace(/-<\/em><\/p>/g, "—
");
+ xml = xml.replace(/-
/g, "—
");
+ xml = xml.replace(/-<\/([a-z]+)><\/p>/g, "—$1>");
xml = xml.replace(/\s?\s?–\s?\s?/g, "—");
xml = xml.replace(/-\s\s?/g, "—");
xml = xml.replace(/\s?\s-/g, "—");
From cc2db87b5843c1927c425c2b911a899179c88a00 Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 16:55:45 -0500
Subject: [PATCH 42/76] 4.9.0
---
npm-shrinkwrap.json | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 748555a..35c64ed 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -1,6 +1,6 @@
{
"name": "worm-scraper",
- "version": "4.8.0",
+ "version": "4.9.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 7437398..d21c2be 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"parahuman",
"scraper"
],
- "version": "4.8.0",
+ "version": "4.9.0",
"author": "Domenic Denicola (https://domenic.me/)",
"license": "WTFPL",
"repository": "domenic/worm-scraper",
From 28d4c6927a9873e250ad52d4564d1b7c5e813d6f Mon Sep 17 00:00:00 2001
From: Domenic Denicola
Date: Sat, 26 Dec 2020 17:31:16 -0500
Subject: [PATCH 43/76] Add a new cover for Worm
---
covers/worm/cover.jpg | Bin 0 -> 383259 bytes
covers/worm/cover.png | Bin 339496 -> 0 bytes
covers/worm/cover.xhtml | 2 +-
3 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 covers/worm/cover.jpg
delete mode 100644 covers/worm/cover.png
diff --git a/covers/worm/cover.jpg b/covers/worm/cover.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f4c70423e93055c223742b03c970c906b4da63bb
GIT binary patch
literal 383259
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