Since there doesn't appear to be a tool to do what I wanted, this is how I solved my issue for anyone following after me.
I checked out this git repository
I ran the Perl command on that repository's index.html file:
perl morphhbXML-to-JSON.pl --stripPointing --removeLemmaTypes --prefixLemmasWithH --remapVerses
This created a JSON file named "hebrew.json" in the same directory as the morphhb/index.html file.
I wrote a node application that imports the JSON file, parses it, loops over each book in the object, loops over each chapter in each book, loops over each verse in each chapter, loops over each word in each verse.
Finally, I did:
const hebrew_full = word_array[0];
const strong_full = word_array[1];
const morph_full = word_array[2];
if(morph_full.includes("HV")){
let morph = morph_full.split("/")[0];
let hebrew = hebrew_full.split("/")[0];
let strong = strong_full.split(" ")[0];
let morph_array = morph.split("");
let word_object = {"hebrew":hebrew
,"strong":strong
,"morph":morph
,"verse":`${book_string} ${chapter_number+1}:${verse_number+1}`
,"language":morph_array[0]
,"part":morph_array[1]
,"stem":morph_array[2]
,"type":morph_array[3]
,"person":morph_array[4]
,"gender":morph_array[5]
,"number":morph_array[6]
,"state":morph_array[7]
};
myApp.morph_array.push(word_object);
}
After this ran over the entire Bible JSON file (took about 1 millisecond) I was able to do something like:
let result = myApp.morph_array.filter(function(v, i) {
return (v.strong === "1254"
&& v.stem === "q"
&& v.type === "p"
&& v.person === "3"
&& v.gender === "m"
&& v.number === "s"
);
});
console.log(result.map(a => a.verse));
and it returned
[
'Genesis 1:1',
'Genesis 1:27',
'Genesis 1:27',
'Genesis 2:3',
'Genesis 5:2',
'Deuteronomy 4:32',
'Isaiah 40:26',
'Isaiah 41:20',
'Isaiah 45:18',
'Jeremiah 31:22',
'Malachi 2:10'
]
The next step is to put an interface on the front of this, but this gets me far enough along to be useful for my own purposes.