9c2d11ccfb0c87e3561b584b1413bd0e21f9b285 hiram Thu Sep 5 14:30:47 2024 -0700 correctly highlight a compound word even when * wildcard included refs #32596 diff --git src/hg/js/assemblySearch.js src/hg/js/assemblySearch.js index ad092a5..5cb6ac9 100644 --- src/hg/js/assemblySearch.js +++ src/hg/js/assemblySearch.js @@ -289,58 +289,72 @@ // queryString. This is tricky, there are extra characters besides // just [a-zA-Z] that are getting in the way of these matches, where // the MySQL could match, for example: checking: // 'HG02257' =? '(HG02257.pat' // 'HG02257' =? 'HG02257.alt.pat.f1_v2' // doesn't match here, but MySQL match did function highlightMatch(queryString, rowData) { // fixup the queryString words to get rid of the special characters var words = queryString.split(/\s+/); var wholeWord = []; // going to be words that match completely var prefix = []; // going to be words that match prefix for (let word of words) { var noPrefix = word.replace(/^[-+]/, ''); // remove + - beginning if (noPrefix.endsWith("*")) { + let subPrefix = noPrefix.replace(/\*$/, '').match(/(\w+)/g); + if (subPrefix.length > 1) { + let i = 0; + for ( ; i < subPrefix.length - 1; i++) { + wholeWord.push(subPrefix[i]); + } + prefix.push(subPrefix[i].replace(/\*$/, '')); + } else { prefix.push(noPrefix.replace(/\*$/, '')); + } } else { wholeWord.push(noPrefix); } } if (wholeWord.length > 0) { for (let word of wholeWord) { for (let key in rowData) { if (rowData.hasOwnProperty(key)) { if (typeof rowData[key] === 'string') { let value = rowData[key]; let subWords = value.match(/(\w+)|(\W+)/g); let newString = ""; + let wholeSubs = word.match(/(\w+)/g); + if (wholeSubs.length > 0) { + for (let whole of wholeSubs) { for (let subWord of subWords) { - if ( word.toLowerCase() === subWord.toLowerCase() ) { + if ( whole.toLowerCase() === subWord.toLowerCase() ) { newString += "" + subWord + ""; } else { newString += subWord; } } newString = newString.trim(); if (newString !== rowData[key]) rowData[key] = newString; - } - } - } - } - } + } // for (let whole of wholeSubs) + } // if (wholeSubs.length > 0) + } // if (typeof rowData[key] === 'string') + } // if (rowData.hasOwnProperty(key)) + } // for (let key in rowData) + } // for (let word of wholeWord) + } // if (wholeWord.length > 0) if (prefix.length > 0) { for (let word of prefix) { for (let key in rowData) { if (rowData.hasOwnProperty(key)) { if (typeof rowData[key] === 'string') { let value = rowData[key]; let subWords = value.match(/(\w+)|(\W+)/g); let newString = ""; for (let subWord of subWords) { if ( subWord.toLowerCase().startsWith(word.toLowerCase())) { newString += "" + subWord + ""; } else { newString += subWord; } }