mirror of
https://github.com/S2-/gitlit
synced 2025-08-02 20:30:05 +02:00
94 lines
2.8 KiB
JavaScript
94 lines
2.8 KiB
JavaScript
const EventEmitter = require('events')
|
|
const { print } = require('./utils.js')
|
|
|
|
const stopActions = ['clearSelection', 'keepSelection', 'activateSelection']
|
|
const wcs = Symbol('webContents')
|
|
const opts = Symbol('options')
|
|
const requestId = Symbol('requestId')
|
|
const activeMatch = Symbol('activeMatch')
|
|
const matches = Symbol('matches')
|
|
const initd = Symbol('initd')
|
|
const preText = Symbol('preText')
|
|
|
|
class Find extends EventEmitter {
|
|
constructor (webContents, options = {}) {
|
|
super()
|
|
this[wcs] = webContents
|
|
this[opts] = options
|
|
this[requestId] = null
|
|
this[activeMatch] = 0
|
|
this[matches] = 0
|
|
this[initd] = false
|
|
this[preText] = ''
|
|
}
|
|
initFind () {
|
|
if (this[initd]) return false
|
|
if (isWebContents.call(this)) {
|
|
bindFound.call(this)
|
|
return this[initd] = true
|
|
} else {
|
|
throw new Error('[Find] In need of a valid webContents !')
|
|
}
|
|
}
|
|
destroyFind () {
|
|
this[wcs] = null
|
|
this[opts] = null
|
|
this[requestId] = null
|
|
this[activeMatch] = 0
|
|
this[matches] = 0
|
|
this[initd] = false
|
|
this[preText] = ''
|
|
}
|
|
isFinding () {
|
|
return !!this[requestId]
|
|
}
|
|
startFind (text = '', forward = true, matchCase = false) {
|
|
if (!text) return
|
|
this[activeMatch] = 0
|
|
this[matches] = 0
|
|
this[preText] = text
|
|
this[requestId] = this[wcs].findInPage(this[preText], {
|
|
forward,
|
|
matchCase
|
|
})
|
|
print(`[Find] startFind text=${text} forward=${forward} matchCase=${matchCase}`)
|
|
}
|
|
findNext (forward, matchCase = false) {
|
|
if (!this.isFinding()) throw new Error('Finding did not start yet !')
|
|
this[requestId] = this[wcs].findInPage(this[preText], {
|
|
forward,
|
|
matchCase,
|
|
findNext: true
|
|
})
|
|
print(`[Find] findNext text=${this[preText]} forward=${forward} matchCase=${matchCase}`)
|
|
}
|
|
stopFind (action) {
|
|
stopActions.includes(action) ? '' : action = 'clearSelection'
|
|
this[wcs].stopFindInPage(action)
|
|
print(`[Find] stopFind action=${action}`)
|
|
}
|
|
}
|
|
function isWebContents () {
|
|
return (this[wcs] &&
|
|
typeof this[wcs].findInPage === 'function' &&
|
|
typeof this[wcs].stopFindInPage === 'function')
|
|
}
|
|
function bindFound () {
|
|
this[wcs].on('found-in-page', (e, r) => {
|
|
onFoundInPage.call(this, r)
|
|
})
|
|
}
|
|
function onFoundInPage (result) {
|
|
print('[Find] onFoundInPage, ', result)
|
|
if (this[requestId] !== result.requestId) return
|
|
typeof result.activeMatchOrdinal === 'number' ? this[activeMatch] = result.activeMatchOrdinal : ''
|
|
typeof result.matches === 'number' ? this[matches] = result.matches : ''
|
|
result.finalUpdate ? reportResult.call(this) : ''
|
|
}
|
|
function reportResult () {
|
|
this.emit('result', this[activeMatch], this[matches])
|
|
typeof this[opts].onResult === 'function' ? this[opts].onResult(this[activeMatch], this[matches]) : ''
|
|
}
|
|
|
|
module.exports = Find
|