mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-10-31 05:24:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| import get from 'lodash/get'
 | |
| import slugify from 'slugify'
 | |
| 
 | |
| export default (query, page, additionalStr = null) => {
 | |
|   let domain = get(page, 'title', '')
 | |
| 
 | |
|   if (get(page, 'frontmatter.tags')) {
 | |
|     domain += ` ${page.frontmatter.tags.join(' ')}`
 | |
|   }
 | |
| 
 | |
|   if (additionalStr) {
 | |
|     domain += ` ${additionalStr}`
 | |
|   }
 | |
| 
 | |
|   query = slugify(query, {lower: true, strict: true})
 | |
|   domain = slugify(domain, {lower: true, strict: true})
 | |
| 
 | |
|   return matchTest(query, domain)
 | |
| }
 | |
| 
 | |
| const matchTest = (query, domain) => {
 | |
| 
 | |
|   const escapeRegExp = str => str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
 | |
| 
 | |
|   const words = query
 | |
|     .split(/\s+/g)
 | |
|     .map(str => str.trim())
 | |
|     .filter(str => !!str)
 | |
|   const hasTrailingSpace = query.endsWith(' ')
 | |
|   const searchRegex = new RegExp(
 | |
|     words
 | |
|       .map((word, index) => {
 | |
|         if (words.length === index + 1 && !hasTrailingSpace) {
 | |
|           // The last word - ok with the word being "startswith"-like
 | |
|           return `(?=.*\\b${escapeRegExp(word)})`
 | |
|         } else {
 | |
|           // Not the last word - expect the whole word exactly
 | |
|           return `(?=.*\\b${escapeRegExp(word)}\\b)`
 | |
|         }
 | |
|       })
 | |
|       .join('') + '.+',
 | |
|     'gi'
 | |
|   )
 | |
|   return searchRegex.test(domain)
 | |
| }
 | 
