import { CachedMetadata } from 'obsidian'
import {
isSearchMatch,
regexLineSplit,
regexWikilink,
regexYaml,
SearchMatch,
} from './globals'
export function highlighter(str: string): string {
return '' + str + ''
}
export function escapeHTML(html: string): string {
return html
.replaceAll('&', '&')
.replaceAll('<', '<')
.replaceAll('>', '>')
.replaceAll('"', '"')
.replaceAll("'", ''')
}
/**
* The "title" line is the first line that isn't a wikilink
* @param text
* @returns
*/
export function getTitleLineIndex(lines: string[]): number {
const index = lines.findIndex(l => !regexWikilink.test(l))
return index > -1 ? index : 0
}
/**
* Returns the "title" line from a text
* @param text
* @returns
*/
export function getTitleLine(text: string): string {
const lines = splitLines(text.trim())
return lines[getTitleLineIndex(lines)]
}
/**
* Removes the "title" line from a text
* @param text
* @returns
*/
export function removeTitleLine(text: string): string {
const lines = splitLines(text.trim())
const index = getTitleLineIndex(lines)
lines.splice(index, 1)
return lines.join('. ')
}
export function splitLines(text: string): string[] {
return text.split(regexLineSplit).filter(l => !!l && l.length > 2)
}
export function removeFrontMatter(text: string): string {
// Regex to recognize YAML Front Matter (at beginning of file, 3 hyphens, than any charecter, including newlines, then 3 hyphens).
return text.replace(regexYaml, '')
}
export function wait(ms: number): Promise {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms)
})
}
// https://stackoverflow.com/a/3561711
export function escapeRegex(str: string): string {
return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
/**
* Returns the positions of all occurences of `val` inside of `text`
* https://stackoverflow.com/a/58828841
* @param text
* @param val
* @returns
*/
export function getAllIndexes(text: string, val: RegExp): SearchMatch[] {
return [...text.matchAll(val)]
.map(o => ({ match: o[0], index: o.index }))
.filter(isSearchMatch)
}
export function extractHeadingsFromCache(
cache: CachedMetadata,
level: number,
): string[] {
return (
cache.headings?.filter(h => h.level === level).map(h => h.heading) ?? []
)
}