Home

Awesome

Zotero Plugin Template

GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars GitHub Repo stars

This is a plugin template for Zotero. Plugins using this template are shown above.

πŸ“–Plugin Development Documentation(Chinese, provides English translation)

πŸ› οΈZotero Plugin Toolkit | API Documentation

ℹ️Zotero Type Definitions

πŸ“œZotero Source Code

πŸ“ŒZotero Plugin Template(This repo)

πŸ‘You are currently in bootstrap extension mode. To use overlay mode, plsase switch to overlay branch in git.

πŸ‘ Watch this repo so that you can be notified whenever there are fixes & updates.

If you are using this repo, I recommended that you put this badge (Using Zotero Plugin Template) on your README:

[![Using Zotero Plugin Template](https://img.shields.io/badge/Using-Zotero%20Plugin%20Template-blue?style=flat-square&logo=github)](https://github.com/windingwind/zotero-plugin-template)

Features

Examples

This repo provides examples for zotero-plugin-toolkit APIs.

Search @example in src/examples.ts. The examples are called in src/hooks.ts.

Basic Examples

Shortcut Keys Examples

UI Examples

image

Preference Pane Examples

image

See src/modules/preferenceScript.ts

HelperExamples

image

PromptExamples

An Obsidian-style prompt(popup command input) module. It accepts text command to run callback, with optional display in the popup.

Activate with Shift+P.

image

Quick Start Guide

Install Pre-built xpi

See how the examples work by directly downloading the xpi file from GitHub release and install it to your Zotero.

This is also how your plugin will be released and used by others.

The release do not promise any real functions. It is probably not up-to-date.

The xpi package is a zip file. However, please don't modify it directly. Modify the source code and build it.

Build from Source

{
  version,
  author,
  description,
  homepage,
  config {
    releasepage, // URL to releases(`.xpi`)
    updaterdf, // URL to update.json
    addonName, // name to be displayed in the plugin manager
    addonID, // ID to avoid confliction. IMPORTANT!
    addonRef, // e.g. Element ID prefix
    addonInstance // the plugin's root instance: Zotero.${addonInstance}
  }
}

Be careful to set the addonID and addonRef to avoid confliction.

What the difference between dev & prod?

Release

To build and release, use

# A release-it command: version increase, npm run build, git push, and GitHub release
# You need to set the environment variable GITHUB_TOKEN https://github.com/settings/tokens
# release-it: https://github.com/release-it/release-it
npm run release

Setup Development Environment

  1. Install a beta version of Zotero: https://www.zotero.org/support/beta_builds (Zotero 7 beta: https://www.zotero.org/support/dev/zotero_7_for_developers)

  2. Install Firefox 60(for Zotero 6)/Firefox 102(for Zotero 7)

  3. Copy zotero command line config file. Modify the commands that starts your installation of the beta Zotero.

(Optional) Do this only once: Start the beta Zotero with /path/to/zotero -p. Create a new profile and use it as your development profile. Use /path/to/zotero -p {profile_name} to specify which profile to run with.

cp ./scripts/zotero-cmd-default.json ./scripts/zotero-cmd.json
vim ./scripts/zotero-cmd.json
  1. Setup plugin development environment following this link.

  2. Build plugin and restart Zotero with npm run restart.

  3. Launch Firefox 60(Zotero 6)/Firefox 102(Zotero 7)

  4. In Firefox, go to devtools, go to settings, click "enable remote debugging" and the one next to it that's also about debugging

Press shift+F8 in FF 60, or enter about:debugging#/setup in FF 102.

  1. In Zotero, go to setting, advanced, config editor, look up "debugging" and click on "allow remote debugging".

  2. Connect to Zotero in Firefox.

In FF 60, click the hamburger menu in the top right -> web developer -> Connect..., then enter localhost:6100.

In FF 102, enter localhost:6100 in the bottom input of remote-debugging page and click add.

  1. Click connect in the leftside-bar of Firefox remote-debugging page.

  2. Click "Inspect Main Process"

Debug in Zotero

You can also:

Details

About Hooks

See also src/hooks.ts

  1. When install/enable/startup triggered from Zotero, bootstrap.js > startup is called
    • Wait for Zotero ready
    • Load index.js (the main entrance of plugin code, built from index.ts)
    • Register resources if Zotero 7+
  2. In the main entrance index.js, the plugin object is injected under Zotero and hooks.ts > onStartup is called.
    • Initialize anything you want, including notify listeners, preference panes, and UI elements.
  3. When uninstall/disabled triggered from Zotero, bootstrap.js > shutdown is called.
    • events.ts > onShutdown is called. Remove UI elements, preference panes, or anything created by the plugin.
    • Remove scripts and release resources.

About Global Variables

See also src/index.ts

The bootstrapped plugin runs in a sandbox, which does not have default global variables like Zotero or window, which we used to have in the overlay plugins' window environment.

This template registers the following variables to the global scope:

Zotero, ZoteroPane, Zotero_Tabs, window, document, rootURI, ztoolkit, addon;

About Preference

Zotero 6 doesn't support preference pane injection in bootstrap mode, thus I write a register for Zotero 6 or lower.

You only need to maintain one preferences.xhtml which runs natively on Zotero 7 and let the plugin template handle it when it is running on Zotero 6.

<table style="margin-left: auto; margin-right: auto;"> <tr> <td> <img width="350px" src="https://user-images.githubusercontent.com/33902321/208080125-2a776a98-f427-4c81-8924-7877bf803e3d.png"/> <div>Zotero 7</div> </td> <td> <img width="300px" src="https://user-images.githubusercontent.com/33902321/208080491-b7006c08-2679-4f85-9a28-dba8e622d745.png"/> <div>Zotero 6</div> </td> </tr> </table>

https://github.com/windingwind/zotero-plugin-template/blob/08d72a4e2b3bacff574f537bbd06cb33e6b22480/src/modules/examples.ts#L73-L85

<preferences> element is deprecated. Please use the full pref-key in the elements' preference attribute. Like:

<checkbox label="&zotero.__addonRef__.pref.enable.label;" preference="extensions.zotero.__addonRef__.enable" />

The elements with preference attributes will bind to Zotero preferences.

Remember to call unregister() on plugin unload.

Create Elements API

The plugin template provides new APIs for bootstrap plugins. We have two reasons to use these APIs, instead of the createElement/createElementNS:

createElement(document, "div"); // returns HTMLDivElement
createElement(document, "hbox"); // returns XUL.Box
createElement(document, "button", { namespace: "xul" }); // manually set namespace. returns XUL.Button

About Build

Use Esbuild to build .ts source code to .js.

Use replace-in-file to replace keywords and configurations defined in package.json in non-build files (.xul/xhtml, .dtd, and .properties).

Steps in scripts/build.js:

  1. Clean ./builds
  2. Copy ./addon to ./builds
  3. Esbuild to ./builds/addon/chrome/content/scripts
  4. Replace __buildVersion__ and __buildTime__ in ./builds/addon
  5. Zip the ./builds/addon to ./builds/*.xpi

About Zotero API

Zotero docs are outdated and incomplete. Clone https://github.com/zotero/zotero and search the keyword globally.

⭐The zotero-types provides most frequently used Zotero APIs. It's included in this template by default. Your IDE would provide hint for most of the APIs.

A trick for finding the API you want:

Search the UI label in .xul(.xhtml)/.dtd/.properties files, find the corresponding key in locale file. Then search this keys in .js/.jsx files.

Directory Structure

This section shows the directory structure of a template.

β”‚  .gitignore
β”‚  .release-it.json # release-it conf
|  tsconfig.json    # https://code.visualstudio.com/docs/languages/jsconfig#
β”‚  build.js         # esbuild
β”‚  LICENSE
β”‚  package.json     # npm conf
β”‚  README.md        # readme
β”‚  update.rdf       # addon update
β”‚
β”œβ”€.github           # github conf
β”‚
β”œβ”€addon             # addon dir
β”‚  β”‚  chrome.manifest  # for Zotero 6
β”‚  β”‚  manifest.json # for Zotero 7
β”‚  β”‚  install.rdf   # addon install conf, for Zotero 6
β”‚  β”‚  bootstrap.js  # addon load/unload script, like a main.c
β”‚  β”‚
β”‚  └─chrome
β”‚      β”œβ”€content    # UI
β”‚      β”‚  β”‚  preferences.xhtml
β”‚      β”‚  β”‚
β”‚      β”‚  β”œβ”€icons
β”‚      β”‚  β”‚      favicon.png
β”‚      β”‚  β”‚      favicon@0.5x.png
β”‚      β”‚  β”‚
β”‚      β”‚  └─scripts
β”‚      └─locale     # locale
β”‚         β”œβ”€en-US
β”‚         β”‚      overlay.dtd
β”‚         β”‚      addon.properties
β”‚         β”‚
β”‚         β”œβ”€zh-CN
β”‚         |      overlay.dtd
β”‚         └─     addon.properties
β”‚
β”œβ”€builds            # build dir
β”‚  └─.xpi
β”‚
└─src               # source code
    β”‚  index.ts     # main entry
    β”‚  addon.ts     # base class
    β”‚  hooks.ts     # lifecycle hooks
    |
    └─modules       # sub modules
       β”‚  examples.ts           # examples factory
       β”‚  locale.ts             # locale .properties
       β”‚  preferenceScript.ts   # script runs in preferences.xhtml
       └─ progressWindow.ts     # progressWindow tool

Disclaimer

Use this code under AGPL. No warranties are provided. Keep the laws of your locality in mind!

If you want to change the license, please contact me at wyzlshx@foxmail.com

Part of the code of this repo refers to other open-source projects within the allowed scope.