# Zotero Plugin Template            This is a plugin template for [Zotero](https://www.zotero.org/). Plugins using this template are shown above. π[Plugin Development Documentation](https://zotero.yuque.com/books/share/8d230829-6004-4934-b4c6-685a7001bfa0/vec88d)(Chinese, provides English translation) π οΈ[Zotero Plugin Toolkit](https://github.com/windingwind/zotero-plugin-toolkit) | [API Documentation](https://github.com/windingwind/zotero-plugin-toolkit/blob/master/docs/zotero-plugin-toolkit.md) βΉοΈ[Zotero Type Definitions](https://github.com/windingwind/zotero-types) π[Zotero Source Code](https://github.com/zotero/zotero) π[Zotero Plugin Template](https://github.com/windingwind/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 ([](https://github.com/windingwind/zotero-plugin-template)) on your README: ```md [](https://github.com/windingwind/zotero-plugin-template) ``` ## Features - Event-driven, functional programming, under extensive skeleton; - Simple and user-friendly, works out-of-the-box. - Abundant examples in `src/modules/examples.ts`, covering most of the commonly used APIs in plugins(using [zotero-plugin-toolkit](https://github.com/windingwind/zotero-plugin-toolkit)); - TypeScript support: - Full type definition support for the whole Zotero project, which is written in JavaScript(using [zotero-types](https://github.com/windingwind/zotero-types)); - Global variables and environment setup; - Plugin build/test/release workflow: - Automatically generate/update plugin id/version, update configrations, and set environment variables(`development/production`); - Automatically build and reload code in Zotero; - Automatically release to GitHub(using [release-it](https://github.com/release-it/release-it)); - β[New!]Compatibilities for Zotero 6 & Zotero 7.(using [zotero-plugin-toolkit](https://github.com/windingwind/zotero-plugin-toolkit)) ## Examples This repo provides examples for [zotero-plugin-toolkit](https://github.com/windingwind/zotero-plugin-toolkit) APIs. Search `@example` in `src/examples.ts`. The examples are called in `src/hooks.ts`. ### Basic Examples - registerNotifier - registerPrefs, unregisterPrefs ### Shortcut Keys Examples - registerShortcuts - exampleShortcutLargerCallback - exampleShortcutSmallerCallback - exampleShortcutConflictionCallback ### UI Examples  - registerStyleSheet(the official make-it-red example) - registerRightClickMenuItem - registerRightClickMenuPopup - registerWindowMenuWithSeprator - registerExtraColumn - registerExtraColumnWithCustomCell - registerCustomItemBoxRow - registerCustomCellRenderer - registerLibraryTabPanel - registerReaderTabPanel ### Preference Pane Examples  - Preferences bindings - UI Events - Tabel - Locale See [`src/modules/preferenceScript.ts`](./src/modules/preferenceScript.ts) ### HelperExamples  - dialogExample - clipboardExample - filePickerExample - progressWindowExample - vtableExample(See Preference Pane Examples) ### 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`.  - registerAlertPromptExample ## 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 - Fork this repo/Click `Use this template`; - Git clone the forked repo; - Enter the repo folder; - Modify the settings in `./package.json`, including: ```json5 { 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. - Run `npm install` to set up the plugin and install dependencies. If you don't have NodeJS installed, please download it [here](https://nodejs.org/en/); - Run `npm run build` to build the plugin in production mode. Run `npm run build-dev` to build the plugin in development mode. The xpi for installation and the built code is under `builds` folder. > What the difference between dev & prod? > > - This environment variable is stored in `Zotero.${addonInstance}.data.env`. The outputs to console is disabled in prod mode. > - You can decide what users cannot see/use based on this variable. ### Release To build and release, use ```shell # 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. ```sh cp ./scripts/zotero-cmd-default.json ./scripts/zotero-cmd.json vim ./scripts/zotero-cmd.json ``` 4. Setup plugin development environment following this [link](https://www.zotero.org/support/dev/client_coding/plugin_development#setting_up_a_plugin_development_environment). 5. Build plugin and restart Zotero with `npm run restart`. 6. Launch Firefox 60(Zotero 6)/Firefox 102(Zotero 7) 7. 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. 8. In Zotero, go to setting, advanced, config editor, look up "debugging" and click on "allow remote debugging". 9. 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`. 10. Click `connect` in the leftside-bar of Firefox remote-debugging page. 11. Click "Inspect Main Process" ### Debug in Zotero You can also: - Test code snipastes in Tools->Developer->Run Javascript; - Debug output with `Zotero.debug()`. Find the outputs in Help->Debug Output Logging->View Output; - Debug UI. Zotero is built on the Firefox XUL framework. Debug XUL UI with software like [XUL Explorer](https://udn.realityripple.com/docs/Archive/Mozilla/XUL_Explorer). > XUL Documentation: http://www.devdoc.net/web/developer.mozilla.org/en-US/docs/XUL.html ## Details ### About Hooks > See also [`src/hooks.ts`](https://github.com/windingwind/zotero-plugin-template/blob/bootstrap/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`](https://github.com/windingwind/zotero-plugin-template/blob/bootstrap/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: ```ts 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.
![]() Zotero 7
|
![]() Zotero 6
|