Escape HTML
Instead of trying to do some smart (and unsecure) stuff, just display the raw note contents as is
This commit is contained in:
@@ -30,7 +30,6 @@
|
||||
"typescript": "4.4.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"markdown-to-txt": "^2.0.0",
|
||||
"minisearch": "^5.0.0-beta1"
|
||||
}
|
||||
}
|
||||
36
pnpm-lock.yaml
generated
36
pnpm-lock.yaml
generated
@@ -12,7 +12,6 @@ specifiers:
|
||||
eslint-plugin-import: 2.22.1
|
||||
eslint-plugin-node: 11.1.0
|
||||
eslint-plugin-promise: 5.0.0
|
||||
markdown-to-txt: ^2.0.0
|
||||
minisearch: ^5.0.0-beta1
|
||||
obsidian: latest
|
||||
prettier: ^2.6.2
|
||||
@@ -21,7 +20,6 @@ specifiers:
|
||||
typescript: 4.4.4
|
||||
|
||||
dependencies:
|
||||
markdown-to-txt: 2.0.0
|
||||
minisearch: 5.0.0-beta1
|
||||
|
||||
devDependencies:
|
||||
@@ -36,7 +34,7 @@ devDependencies:
|
||||
eslint-plugin-import: 2.22.1_eslint@7.12.1
|
||||
eslint-plugin-node: 11.1.0_eslint@7.12.1
|
||||
eslint-plugin-promise: 5.0.0_eslint@7.12.1
|
||||
obsidian: 0.14.4
|
||||
obsidian: 0.14.6
|
||||
prettier: 2.6.2
|
||||
prettier-eslint: 13.0.0
|
||||
tslib: 2.3.1
|
||||
@@ -1490,18 +1488,10 @@ packages:
|
||||
path-exists: 3.0.0
|
||||
dev: true
|
||||
|
||||
/lodash.escape/4.0.1:
|
||||
resolution: {integrity: sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=}
|
||||
dev: false
|
||||
|
||||
/lodash.merge/4.6.2:
|
||||
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
|
||||
dev: true
|
||||
|
||||
/lodash.unescape/4.0.1:
|
||||
resolution: {integrity: sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=}
|
||||
dev: false
|
||||
|
||||
/lodash/4.17.21:
|
||||
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
|
||||
dev: true
|
||||
@@ -1525,20 +1515,6 @@ packages:
|
||||
yallist: 4.0.0
|
||||
dev: true
|
||||
|
||||
/markdown-to-txt/2.0.0:
|
||||
resolution: {integrity: sha512-H5DSAY6frUQ6/CR0nJMlGCEuSA3pvi14dYfICJPKLAvd/rDk6eb+cj84zU5XTNYzECyCcujoAL1PHhjmOgeqUw==}
|
||||
dependencies:
|
||||
lodash.escape: 4.0.1
|
||||
lodash.unescape: 4.0.1
|
||||
marked: 3.0.8
|
||||
dev: false
|
||||
|
||||
/marked/3.0.8:
|
||||
resolution: {integrity: sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==}
|
||||
engines: {node: '>= 12'}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/merge2/1.4.1:
|
||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||
engines: {node: '>= 8'}
|
||||
@@ -1573,8 +1549,8 @@ packages:
|
||||
minimist: 1.2.6
|
||||
dev: true
|
||||
|
||||
/moment/2.29.1:
|
||||
resolution: {integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==}
|
||||
/moment/2.29.2:
|
||||
resolution: {integrity: sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==}
|
||||
dev: true
|
||||
|
||||
/ms/2.0.0:
|
||||
@@ -1626,13 +1602,13 @@ packages:
|
||||
es-abstract: 1.19.2
|
||||
dev: true
|
||||
|
||||
/obsidian/0.14.4:
|
||||
resolution: {integrity: sha512-lWU1w/NlXuswAa35ImAbyElLOOno1C13KCZE19kqtcxSPIquvi5Fzy8zBbQ6ZRZZvkvftUiToCp5lcZFRMGxrQ==}
|
||||
/obsidian/0.14.6:
|
||||
resolution: {integrity: sha512-oXPJ8Zt10WhN19bk5l4mZuXRZbbdT1QoMgxGGJ0bB7UcJa0bozDzugS5L/QiV9gDoujpUPxDWNVahEel6r0Fpw==}
|
||||
dependencies:
|
||||
'@codemirror/state': 0.19.9
|
||||
'@codemirror/view': 0.19.48
|
||||
'@types/codemirror': 0.0.108
|
||||
moment: 2.29.1
|
||||
moment: 2.29.2
|
||||
dev: true
|
||||
|
||||
/once/1.4.0:
|
||||
|
||||
22
src/main.ts
22
src/main.ts
@@ -1,10 +1,6 @@
|
||||
import { Notice, Plugin, TAbstractFile, TFile } from 'obsidian'
|
||||
import MiniSearch from 'minisearch'
|
||||
import {
|
||||
clearContent,
|
||||
extractHeadingsFromCache,
|
||||
wait,
|
||||
} from './utils'
|
||||
import { escapeHTML, extractHeadingsFromCache, wait } from './utils'
|
||||
import { IndexedNote } from './globals'
|
||||
import { OmnisearchModal } from './modal'
|
||||
|
||||
@@ -97,7 +93,7 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
}
|
||||
// Fetch content from the cache,
|
||||
// trim the markdown, remove embeds and clear wikilinks
|
||||
const content = clearContent(await this.app.vault.cachedRead(file))
|
||||
const content = escapeHTML(await this.app.vault.cachedRead(file))
|
||||
|
||||
// Purge HTML before indexing
|
||||
const tmp = document.createElement('div')
|
||||
@@ -106,11 +102,17 @@ export default class OmnisearchPlugin extends Plugin {
|
||||
// Make the document and index it
|
||||
const note: IndexedNote = {
|
||||
basename: file.basename,
|
||||
content: tmp.innerText,
|
||||
content: tmp.innerText, // content,
|
||||
path: file.path,
|
||||
headings1: fileCache ? extractHeadingsFromCache(fileCache, 1).join(' ') : '',
|
||||
headings2: fileCache ? extractHeadingsFromCache(fileCache, 2).join(' ') : '',
|
||||
headings3: fileCache ? extractHeadingsFromCache(fileCache, 3).join(' ') : '',
|
||||
headings1: fileCache
|
||||
? extractHeadingsFromCache(fileCache, 1).join(' ')
|
||||
: '',
|
||||
headings2: fileCache
|
||||
? extractHeadingsFromCache(fileCache, 2).join(' ')
|
||||
: '',
|
||||
headings3: fileCache
|
||||
? extractHeadingsFromCache(fileCache, 3).join(' ')
|
||||
: '',
|
||||
}
|
||||
this.minisearch.add(note)
|
||||
this.indexedNotes[file.path] = note
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { MarkdownView, SuggestModal, TFile } from 'obsidian'
|
||||
import { ResultNote } from './globals'
|
||||
import OmnisearchPlugin from './main'
|
||||
import { escapeRegex, getAllIndexes, highlighter } from './utils'
|
||||
import { escapeHTML, escapeRegex, getAllIndexes, highlighter } from './utils'
|
||||
|
||||
export class OmnisearchModal extends SuggestModal<ResultNote> {
|
||||
private plugin: OmnisearchPlugin
|
||||
@@ -64,7 +64,8 @@ export class OmnisearchModal extends SuggestModal<ResultNote> {
|
||||
const record = events.find(event =>
|
||||
(event.target as HTMLDivElement).classList.contains('is-selected'),
|
||||
)
|
||||
const id = (record?.target as HTMLElement)?.getAttribute('data-note-id') ?? null
|
||||
const id =
|
||||
(record?.target as HTMLElement)?.getAttribute('data-note-id') ?? null
|
||||
if (id) {
|
||||
this.selectedNoteId = id
|
||||
}
|
||||
@@ -119,7 +120,9 @@ export class OmnisearchModal extends SuggestModal<ResultNote> {
|
||||
results.map(async result => {
|
||||
const file = this.app.vault.getAbstractFileByPath(result.id) as TFile
|
||||
// const metadata = this.app.metadataCache.getFileCache(file)
|
||||
let content = (await this.app.vault.cachedRead(file)).toLowerCase()
|
||||
let content = escapeHTML(
|
||||
await this.app.vault.cachedRead(file),
|
||||
).toLowerCase()
|
||||
let basename = file.basename
|
||||
|
||||
// Sort the terms from smaller to larger
|
||||
|
||||
14
src/utils.ts
14
src/utils.ts
@@ -1,4 +1,3 @@
|
||||
import markdownToTxt from 'markdown-to-txt'
|
||||
import { CachedMetadata } from 'obsidian'
|
||||
import {
|
||||
isSearchMatch,
|
||||
@@ -12,12 +11,13 @@ export function highlighter(str: string): string {
|
||||
return '<span class="search-result-file-matched-text">' + str + '</span>'
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips the markdown and frontmatter
|
||||
* @param text
|
||||
*/
|
||||
export function clearContent(text: string): string {
|
||||
return markdownToTxt(removeFrontMatter(text))
|
||||
export function escapeHTML(html: string): string {
|
||||
return html
|
||||
.replaceAll('&', '&')
|
||||
.replaceAll('<', '<')
|
||||
.replaceAll('>', '>')
|
||||
.replaceAll('"', '"')
|
||||
.replaceAll("'", ''')
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,9 +13,7 @@
|
||||
"isolatedModules": true,
|
||||
"lib": [
|
||||
"DOM",
|
||||
"ES5",
|
||||
"ES6",
|
||||
"ES7"
|
||||
"ES2021"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
|
||||
Reference in New Issue
Block a user