mirror of
				https://github.com/em-squared/5e-drs.git
				synced 2025-11-04 09:11:48 +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)
 | 
						|
}
 |