Skip to content

Commit

Permalink
Merge branch 'master' into gh-2104
Browse files Browse the repository at this point in the history
  • Loading branch information
retorquere committed May 4, 2022
2 parents 4121a10 + b20bde7 commit ac8ec91
Show file tree
Hide file tree
Showing 80 changed files with 29,006 additions and 90,951 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ config.rules['@typescript-eslint/member-delimiter-style'] = [ 'error', {
singleline: { delimiter: 'comma', requireLast: false },
}]
config.rules['@typescript-eslint/no-unused-vars'] = [ 'error', { "argsIgnorePattern": "^_" } ]
config.rules['no-magic-numbers'] = [ "error", { "ignore": [ -1, 0, 1, 2, 100, 1000 ] } ]

config.ignorePatterns = [
'webpack.config.ts',
Expand Down
41 changes: 30 additions & 11 deletions content/Preferences.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { AutoExport } from './auto-export'
import { Translators } from './translators'
import { client } from './client'
import * as l10n from './l10n'
import { Events } from './events'

const namespace = 'http://retorque.re/zotero-better-bibtex/'

Expand All @@ -30,6 +31,10 @@ class AutoExportPane {
}

this.refresh()

Events.on('export-progress', (percent: number, _translator, ae: number) => {
if (percent >= 100) this.refreshCacheRate(ae).catch(err => log.error('failed to refresh cacherate for completed auto-export', ae, err))
})
}

public refresh() {
Expand Down Expand Up @@ -172,16 +177,26 @@ class AutoExportPane {
this.refresh()
}

public async refreshCacheRate(node) {
try {
const $loki = parseInt(node.getAttributeNS(namespace, 'ae-id'))
this.cacherate[$loki] = await AutoExport.cached($loki)
this.refresh()
public async refreshCacheRate(ae: Element | number) {
log.debug('getting cacherate for', typeof ae)
if (typeof ae !== 'number') ae = parseInt(ae.getAttributeNS(namespace, 'ae-id'))
log.debug('getting cacherate for', typeof ae)

if (typeof ae !== 'number') {
log.debug('refresh cacherate on unknown ae?', typeof ae)
}
catch (err) {
log.error('could not refresh cacherate:', err)
this.cacherate = {}
else {
try {
log.debug('getting cacherate for', { ae })
this.cacherate[ae] = await AutoExport.cached(ae)
log.debug('refresh cacherate:', ae, '=', this.cacherate[ae])
}
catch (err) {
log.error('could not refresh cacherate for', ae, err)
delete this.cacherate[ae]
}
}
this.refresh()
}

public edit(node) {
Expand Down Expand Up @@ -260,21 +275,25 @@ export class PrefPane {
if (target) this.keyformat = target
if (!this.keyformat || Zotero.BetterBibTeX.ready.isPending()) return // itemTypes not available yet

let msg
let msg = '', color = ''
try {
Formatter.parsePattern(this.keyformat.value)
msg = ''
if (Formatter.warning) {
msg = Formatter.warning
color = 'yellow'
}
if (this.keyformat.value) this.saveCitekeyFormat(target)
}
catch (err) {
msg = err.message
color = 'DarkOrange'
if (err.location) msg += ` at ${(err.location.start.offset as number) + 1}`
log.error('prefs: key format error:', msg)
}

if (!this.keyformat.value && !msg) msg = 'pattern is empty'

this.keyformat.setAttribute('style', (msg ? '-moz-appearance: none !important; background-color: DarkOrange' : ''))
this.keyformat.setAttribute('style', (msg ? `-moz-appearance: none !important; background-color: ${color}` : ''))
this.keyformat.setAttribute('tooltiptext', msg)
}

Expand Down
4 changes: 3 additions & 1 deletion content/Preferences/citekeys.pug
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ script.
converted.value = ''
if (citekey.value) {
try {
if (!citekey.value.startsWith("''")) converted.value = Zotero.BetterBibTeX.KeyManager.convertLegacy(citekey.value)
if (citekey.value.startsWith('[')) {
converted.value = Zotero.BetterBibTeX.KeyManager.convertLegacy(citekey.value)
}
}
catch (err) {
Zotero.debug('could not convert citekey pattern: ' + err.message)
Expand Down
2 changes: 1 addition & 1 deletion content/Preferences/export/misc.pug
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ groupbox
hbox
label(bbt:preference="pref-better-bibtex-workers") &better-bibtex.Preferences.advanced.export.workers;
scale(min="1" max="10" preference="pref-better-bibtex-workers")
checkbox(preference="pref-better-bibtex-caching" label="&better-bibtex.Preferences.advanced.export.workers.cache;")
checkbox(preference="pref-better-bibtex-cache" label="&better-bibtex.Preferences.advanced.export.workers.cache;")
label.better-bibtex-preferences-worker-state
hbox
button(label="&better-bibtex.Preferences.resetCache;" oncommand="Zotero.BetterBibTeX.PrefPane.cacheReset()")
Expand Down
4 changes: 2 additions & 2 deletions content/Preferences/preferences.pug
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ preference#pref-better-bibtex-quickCopySelectLink(name="extensions.zotero.transl
bbt:doc Hyperlink to select items in your library

// the zero-width-space is a marker to re-save the current default so it doesn't get replaced when the default changes later, which would change new keys suddenly
preference#pref-better-bibtex-citekeyFormat(name="extensions.zotero.translators.better-bibtex.citekeyFormat" bbt:affects="" type="string" default="\u200b[auth:lower][shorttitle3_3][year]")
preference#pref-better-bibtex-citekeyFormat(name="extensions.zotero.translators.better-bibtex.citekeyFormat" bbt:affects="" type="string" default="\u200bauth.lower + shorttitle(3,3) + year")
bbt:doc Set the pattern used to generate citation keys. The format of the keys is documented [here]({{ ref . "citing" }}).
preference#pref-better-bibtex-citekeyFormatBackup(name="extensions.zotero.translators.better-bibtex.citekeyFormatBackup" bbt:affects="" type="string" default="")

Expand Down Expand Up @@ -310,7 +310,7 @@ bbt:doc.
are blocking, and it's a minor miracle I got background
exports to work at all.

preference#pref-better-bibtex-caching(name="extensions.zotero.translators.better-bibtex.caching" bbt:affects="*" type="bool" default="true")
preference#pref-better-bibtex-cache(name="extensions.zotero.translators.better-bibtex.cache" bbt:affects="*" type="bool" default="true")
bbt:doc.
Even though BBT exports happen in a separate thread, some
work needs to be done before the background export can
Expand Down
17 changes: 12 additions & 5 deletions content/ZoteroPane.xul
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,19 @@
<!DOCTYPE overlay SYSTEM "chrome://zotero-better-bibtex/locale/zotero-better-bibtex.dtd">

<overlay id="zotero-better-bibtex-zoteroPane-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<hbox id="zotero-items-toolbar">
<hbox id="better-bibtex-progress" insertbefore="zotero-tb-search-spinner" hidden="true">
<progressmeter id="better-bibtex-progress-meter" mode="determined" value="0"/>
<label id="better-bibtex-progress-label" value="startup"/>
<hbox id="zotero-item-toolbar">
<hbox id="better-bibtex-progress" hidden="true" align="left" pack="start" flex="1">
<hbox id="better-bibtex-progress-meter" class="bbt-progress-sprite" width="20" height="20"></hbox>
<label id="better-bibtex-progress-label" value=""/>
</hbox>
</hbox>
<script>
// Zotero doesn't have an ID for the hbox-before-zotero-pq-buttons
window.addEventListener('load', function() {
const progress = document.getElementById('better-bibtex-progress')
progress.parentNode.insertBefore(progress, progress.parentNode.firstChild.nextSibling)
})
</script>

<menupopup id="menu_ToolsPopup">
<menuitem label="&better-bibtex.BetterBibTeX.auxScanner;" oncommand="Zotero.BetterBibTeX.scanAUX('tag')"/>
Expand Down Expand Up @@ -86,7 +93,7 @@

<script src="chrome://zotero-better-bibtex/content/better-bibtex.js"/>
<script>
Zotero.log('starting BBT', 'error')
Zotero.log('starting BBT')
Zotero.BetterBibTeX.globals = Zotero.BetterBibTeX.ZoteroPane.globals = Function('return this')();
window.addEventListener('load', async function() {
try {
Expand Down
81 changes: 59 additions & 22 deletions content/auto-export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,22 +161,23 @@ const git = new Git()


if (Preference.autoExportDelay < 1) Preference.autoExportDelay = 1
if (Preference.autoExportIdleWait < 1) Preference.autoExportIdleWait = 1
const queue = new class TaskQueue {
private scheduler = new Scheduler('autoExportDelay', 1000) // eslint-disable-line no-magic-numbers
private scheduler = new Scheduler('autoExportDelay', 1000)
private autoexports: any
private started = false
private idleService = Components.classes['@mozilla.org/widget/idleservice;1'].getService(Components.interfaces.nsIIdleService)

constructor() {
this.pause()
this.pause('startup')
}

public start() {
if (this.started) return
this.started = true
if (Preference.autoExport === 'immediate') this.resume()
if (Preference.autoExport === 'immediate') this.resume('startup')

const idleService = Components.classes['@mozilla.org/widget/idleservice;1'].getService(Components.interfaces.nsIIdleService)
idleService.addIdleObserver(this, Preference.autoExportIdleWait)
this.idleService.addIdleObserver(this, Preference.autoExportIdleWait * 1000)

Zotero.Notifier.registerObserver(this, ['sync'], 'BetterBibTeX', 1)
}
Expand All @@ -185,11 +186,40 @@ const queue = new class TaskQueue {
this.autoexports = autoexports
}

public pause() {
public pause(reason: 'startup' | 'end-of-idle' | 'start-of-sync' | 'trigger-change') {
log.debug('idle?: queue paused:', reason)
this.scheduler.paused = true
}

public resume() {
public resume(reason: 'startup' | 'end-of-sync' | 'start-of-idle' | 'trigger-change') {
log.debug('idle?: queue resume request:', reason)
if (Zotero.Sync.Runner.syncInProgress) {
log.debug('idle?: queue not resumed: sync in progress, end-of-sync will trigger resume')
this.scheduler.paused = true
return
}

const is_idle = this.idleService.idleTime >= Preference.autoExportIdleWait * 1000
switch (Preference.autoExport) {
case 'off':
log.debug('idle?: queue not resumed: auto-export is off')
this.scheduler.paused = true
return

case 'idle':
// don't re-schedule idle for end-of-sync / should never happen?
if (!is_idle) {
log.debug('idle?: queue not resumed:', reason, "but we're not actually idle")
this.scheduler.paused = true
return
}
break

case 'immediate':
break
}

log.debug('idle?: queue resumed:', reason)
this.scheduler.paused = false
}

Expand Down Expand Up @@ -300,17 +330,18 @@ const queue = new class TaskQueue {
}

// idle observer
protected observe(_subject, topic, _data) {
protected observe(subject, topic, data) {
log.debug('idle?: observer:', { subject, topic, data })
if (!this.started || Preference.autoExport === 'off') return

switch (topic) {
case 'back':
case 'active':
if (Preference.autoExport === 'idle') this.pause()
this.pause('end-of-idle')
break

case 'idle':
this.resume()
this.resume('start-of-idle')
break

default:
Expand All @@ -327,11 +358,13 @@ const queue = new class TaskQueue {

switch(`${type}.${action}`) {
case 'sync.start':
this.pause()
log.debug('idle?: sync started => pausing queue')
this.pause('start-of-sync')
break

case 'sync.finish':
this.resume()
log.debug('idle?: sync finished => resuming queue')
this.resume('end-of-sync')
break

default:
Expand Down Expand Up @@ -372,7 +405,7 @@ export const AutoExport = new class _AutoExport { // eslint-disable-line @typesc
this.progress.delete(ae.$loki)
})

if (Preference.autoExport === 'immediate') { queue.resume() }
if (Preference.autoExport === 'immediate') queue.resume('startup')
}

public start() {
Expand Down Expand Up @@ -416,7 +449,7 @@ export const AutoExport = new class _AutoExport { // eslint-disable-line @typesc
}

public async cached($loki) {
if (!Preference.caching) return 0
if (!Preference.cache) return 0

const ae = this.db.get($loki)

Expand All @@ -429,9 +462,9 @@ export const AutoExport = new class _AutoExport { // eslint-disable-line @typesc
}
})

const itemIDs: Set<number> = new Set
await this.itemIDs(ae, ae.id, itemTypeIDs, itemIDs)
if (itemIDs.size === 0) return 100 // eslint-disable-line no-magic-numbers
const itemIDset: Set<number> = new Set
await this.itemIDs(ae, ae.id, itemTypeIDs, itemIDset)
if (itemIDset.size === 0) return 100 // eslint-disable-line no-magic-numbers

const options = {
exportNotes: !!ae.exportNotes,
Expand All @@ -443,12 +476,16 @@ export const AutoExport = new class _AutoExport { // eslint-disable-line @typesc
}, {})

const label = Translators.byId[ae.translatorID].label
const selector = cacheSelector(label, options, prefs)
const itemIDs = [...itemIDset]
const query = $and({...selector, itemID: { $in: itemIDs } })
log.debug('fetching cacherate:', { label, query })
const cached = {
serialized: Cache.getCollection('itemToExportFormat').find({ itemID: { $in: [...itemIDs] } }).length,
export: Cache.getCollection(label).find($and({...cacheSelector(label, options, prefs), $in: itemIDs})).length,
serialized: Cache.getCollection('itemToExportFormat').find({ itemID: { $in: itemIDs } }).length,
export: Cache.getCollection(label).find(query).length,
}

return Math.min(Math.round((100 * (cached.serialized + cached.export)) / (itemIDs.size * 2)), 100) // eslint-disable-line no-magic-numbers
return Math.min(Math.round((100 * (cached.serialized + cached.export)) / (itemIDs.length * 2)), 100) // eslint-disable-line no-magic-numbers
}

private async itemIDs(ae, id: number, itemTypeIDs: number[], itemIDs: Set<number>) {
Expand All @@ -475,9 +512,9 @@ Events.on('preference-changed', pref => {

switch (Preference.autoExport) {
case 'immediate':
queue.resume()
queue.resume('trigger-change')
break
default: // off / idle
queue.pause()
queue.pause('trigger-change')
}
})

0 comments on commit ac8ec91

Please sign in to comment.