Skip to content

Commit 4e68501

Browse files
kckernclaude
andcommitted
fix: read pre_rules/post_rules as {pattern,replacement} objects
The YAML migration changed pre_rules/post_rules to {pattern, replacement} objects, but loadRefsFromRanges (LDS + COC) and cleanReference still read them as [pattern, replacement] tuples (rule[0]/rule[1]). rule[0] is undefined -> new RegExp(undefined) = /(?:)/ matches at every position, and rule[1] (undefined) coerces to the literal string 'undefined' in String.replace — so non-English references rendered e.g. 'undefined니undefined파...' instead of '니파이전서 1:16-17', and Korean input parsing (pre_rules) broke the same way. Read rule.pattern/rule.replacement (legacy tuple fallback retained) and guard the replacement against undefined. books arrays are unchanged (still tuples). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent a33895f commit 4e68501

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

src/scriptures.mjs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,12 @@ const loadRefsFromRangesCoc = function(ranges, config) {
479479
// Apply language-specific post rules
480480
if (config.raw_regex.post_rules) {
481481
for (let rule of config.raw_regex.post_rules) {
482-
const re = new RegExp(rule[0], "ig");
483-
ref = ref.replace(re, rule[1]);
482+
// pre_rules/post_rules migrated to {pattern, replacement} objects;
483+
// keep legacy [pattern, replacement] tuple support. Guard the
484+
// replacement so an undefined never coerces to the literal
485+
// "undefined" via String.replace (the ko regression).
486+
const re = new RegExp(rule.pattern ?? rule[0], "ig");
487+
ref = ref.replace(re, rule.replacement ?? rule[1] ?? "");
484488
}
485489
}
486490

@@ -650,8 +654,9 @@ const cleanReference = function(messyReference, config) {
650654
//Build Regex rules
651655
let regex = config.raw_regex.pre_rules;
652656
for (let i in regex) {
653-
var re = new RegExp(regex[i][0], "ig");
654-
ref = ref.replace(re, regex[i][1]);
657+
// pre_rules are {pattern, replacement} objects (legacy: [pattern, replacement]).
658+
var re = new RegExp(regex[i].pattern ?? regex[i][0], "ig");
659+
ref = ref.replace(re, regex[i].replacement ?? regex[i][1] ?? "");
655660
}
656661

657662
//Turn dots into colons
@@ -956,8 +961,12 @@ const loadRefsFromRanges = function(ranges, config) {
956961
// Apply language-specific post rules
957962
if (config.raw_regex.post_rules) {
958963
for (let rule of config.raw_regex.post_rules) {
959-
const re = new RegExp(rule[0], "ig");
960-
ref = ref.replace(re, rule[1]);
964+
// pre_rules/post_rules migrated to {pattern, replacement} objects;
965+
// keep legacy [pattern, replacement] tuple support. Guard the
966+
// replacement so an undefined never coerces to the literal
967+
// "undefined" via String.replace (the ko regression).
968+
const re = new RegExp(rule.pattern ?? rule[0], "ig");
969+
ref = ref.replace(re, rule.replacement ?? rule[1] ?? "");
961970
}
962971
}
963972

0 commit comments

Comments
 (0)