Update README.md
This commit is contained in:
		
							parent
							
								
									574ce88b9f
								
							
						
					
					
						commit
						d7210d930a
					
				
							
								
								
									
										172
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										172
									
								
								README.md
									
									
									
									
									
								
							@ -16,6 +16,7 @@ This is an addon/plugin template for [Zotero](https://www.zotero.org/).
 | 
			
		||||
- Release to GitHub automatically(using [release-it](https://github.com/release-it/release-it));
 | 
			
		||||
- Extensive skeleton;
 | 
			
		||||
- Some sample code of UI and lifecycle.
 | 
			
		||||
- ⭐Compatibilities for Zotero 6 & Zotero 7.
 | 
			
		||||
 | 
			
		||||
## Quick Start Guide
 | 
			
		||||
 | 
			
		||||
@ -40,6 +41,152 @@ This is an addon/plugin template for [Zotero](https://www.zotero.org/).
 | 
			
		||||
- Run `npm install` to setup 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. The xpi for installation and the built code is under builds folder.
 | 
			
		||||
 | 
			
		||||
### Examples
 | 
			
		||||
 | 
			
		||||
#### Menu (file, edit, view, ...) & Right-click Menu (item, collection/library)
 | 
			
		||||
 | 
			
		||||
**File Menu**
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
https://github.com/windingwind/zotero-addon-template/blob/574ce88b9fd3535a9d062db51cf16e99dda35288/src/views.ts#L52-L60
 | 
			
		||||
 | 
			
		||||
**Item Menu**
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
https://github.com/windingwind/zotero-addon-template/blob/574ce88b9fd3535a9d062db51cf16e99dda35288/src/views.ts#L23-L51
 | 
			
		||||
 | 
			
		||||
`Utils.UI.insertMenuItem` resolved the input object and inject the menu items.
 | 
			
		||||
 | 
			
		||||
Available types `menuFile`, `menuEdit`, ...: 
 | 
			
		||||
```ts
 | 
			
		||||
defaultMenuPopupSelectors: {
 | 
			
		||||
  menuFile: "#menu_FilePopup",
 | 
			
		||||
  menuEdit: "#menu_EditPopup",
 | 
			
		||||
  menuView: "#menu_viewPopup",
 | 
			
		||||
  menuGo: "#menu_goPopup",
 | 
			
		||||
  menuTools: "#menu_ToolsPopup",
 | 
			
		||||
  menuHelp: "#menu_HelpPopup",
 | 
			
		||||
  collection: "#zotero-collectionmenu",
 | 
			
		||||
  item: "#zotero-itemmenu",
 | 
			
		||||
},
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can choose an anchor element and insert before/after it using `insertPosition` and `anchorElement`. Default the insert position is the end of menu. 
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
insertMenuItem: (
 | 
			
		||||
  menuPopup: XUL.Menupopup | string,
 | 
			
		||||
  options: MenuitemOptions,
 | 
			
		||||
  insertPosition?: "before" | "after",
 | 
			
		||||
  anchorElement?: XUL.Element
 | 
			
		||||
) => boolean;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Full options you can use:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
declare interface MenuitemOptions {
 | 
			
		||||
  tag: "menuitem" | "menu" | "menuseparator";
 | 
			
		||||
  id?: string;
 | 
			
		||||
  label?: string;
 | 
			
		||||
  // data url (chrome://xxx.png) or base64 url (data:image/png;base64,xxx)
 | 
			
		||||
  icon?: string;
 | 
			
		||||
  class?: string;
 | 
			
		||||
  styles?: { [key: string]: string };
 | 
			
		||||
  hidden?: boolean;
 | 
			
		||||
  disabled?: boolean;
 | 
			
		||||
  oncommand?: string;
 | 
			
		||||
  commandListener?: EventListenerOrEventListenerObject;
 | 
			
		||||
  // Attributes below are used when type === "menu"
 | 
			
		||||
  popupId?: string;
 | 
			
		||||
  onpopupshowing?: string;
 | 
			
		||||
  subElementOptions?: Array<MenuitemOptions>;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Preference, for both Zotero 6 and Zotero 7 (all in bootstrap)
 | 
			
		||||
 | 
			
		||||
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 when it is running on Zotero 6.
 | 
			
		||||
 | 
			
		||||
<table style="margin-left: auto; margin-right: auto;">
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td>
 | 
			
		||||
          <img height="400" src="https://user-images.githubusercontent.com/33902321/208080125-2a776a98-f427-4c81-8924-7877bf803e3d.png"/>
 | 
			
		||||
          <div>Zotero 7</div>
 | 
			
		||||
        </td>
 | 
			
		||||
        <td>
 | 
			
		||||
          <img height="400" 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-addon-template/blob/574ce88b9fd3535a9d062db51cf16e99dda35288/src/views.ts#L63-L82
 | 
			
		||||
 | 
			
		||||
Call `Utils.Compat.registerPrefPane` when it's on Zotero 6. Please make sure `defaultXUL` is set `true` as Zotero 6 requires that.
 | 
			
		||||
 | 
			
		||||
Remember to call `Utils.Compat.unregisterPrefPane()` on plugin onload.
 | 
			
		||||
 | 
			
		||||
https://github.com/windingwind/zotero-addon-template/blob/574ce88b9fd3535a9d062db51cf16e99dda35288/src/views.ts#L88-L90
 | 
			
		||||
 | 
			
		||||
#### 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`:
 | 
			
		||||
 | 
			
		||||
- In bootstrap mode, plugins have to clean up all UI elements on exit (disable or uninstall), which is very annoying. Using the `Utils.UI.createElement`, the plugin template will maintain these elements. Just `Utils.UI.removeAddonElements` on exit.
 | 
			
		||||
- Zotero 7 requires createElement()/createElementNS() → createXULElement() for remaining XUL elements, while on Zotero 6 doesn't support `createXULElement`. Using `Utils.UI.createElement`, it switches API depending on the current platform automatically.
 | 
			
		||||
 | 
			
		||||
Definition:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
function createElement (
 | 
			
		||||
  doc: Document,
 | 
			
		||||
  tagName: string,
 | 
			
		||||
  namespace: "html" | "svg" | "xul"
 | 
			
		||||
) => XUL.Element | DocumentFragment | HTMLElement | SVGAElement;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
There are more advanced APIs for creating elements in batch: `Uitls.UI.creatElementsFromJSON`. Input a element tree in JSON and return a fragment/element. These elements are also maintained by plugin template.
 | 
			
		||||
 | 
			
		||||
Definition:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
function creatElementsFromJSON (
 | 
			
		||||
  doc: Document,
 | 
			
		||||
  options: ElementOptions
 | 
			
		||||
) => XUL.Element | DocumentFragment | HTMLElement | SVGAElement;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Available options:
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
declare interface ElementOptions {
 | 
			
		||||
  tag: string;
 | 
			
		||||
  id?: string;
 | 
			
		||||
  namespace?: "html" | "svg" | "xul";
 | 
			
		||||
  styles?: { [key: string]: string };
 | 
			
		||||
  directAttributes?: { [key: string]: string | boolean | number };
 | 
			
		||||
  attributes?: { [key: string]: string | boolean | number };
 | 
			
		||||
  listeners?: Array<
 | 
			
		||||
    | [
 | 
			
		||||
        string,
 | 
			
		||||
        EventListenerOrEventListenerObject,
 | 
			
		||||
        boolean | AddEventListenerOptions
 | 
			
		||||
      ]
 | 
			
		||||
    | [string, EventListenerOrEventListenerObject]
 | 
			
		||||
  >;
 | 
			
		||||
  checkExistanceParent?: HTMLElement;
 | 
			
		||||
  ignoreIfExists?: boolean;
 | 
			
		||||
  removeIfExists?: boolean;
 | 
			
		||||
  customCheck?: () => boolean;
 | 
			
		||||
  subElementOptions?: Array<ElementOptions>;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Directory Structure
 | 
			
		||||
 | 
			
		||||
This section shows the directory structure of a template.
 | 
			
		||||
@ -71,21 +218,19 @@ This section shows the directory structure of a template.
 | 
			
		||||
│  │
 | 
			
		||||
│  └─chrome
 | 
			
		||||
│      ├─content    # UI
 | 
			
		||||
│      │  │  preferences.xul
 | 
			
		||||
│      │  │  preferences.xhtml
 | 
			
		||||
│      │  │
 | 
			
		||||
│      │  ├─icons
 | 
			
		||||
│      │  │      favicon.png
 | 
			
		||||
│      │  │      favicon@0.5x.png
 | 
			
		||||
│      │  │
 | 
			
		||||
│      │  └─scripts
 | 
			
		||||
│      ├─locale     # locale
 | 
			
		||||
│      │  ├─en-US
 | 
			
		||||
│      │  │      overlay.dtd
 | 
			
		||||
│      │  │
 | 
			
		||||
│      │  └─zh-CN
 | 
			
		||||
│      │         overlay.dtd
 | 
			
		||||
│      │
 | 
			
		||||
│      └─skin       # style
 | 
			
		||||
│          └─default
 | 
			
		||||
│              └─addonname
 | 
			
		||||
│                      favicon.png
 | 
			
		||||
│                      favicon@0.5x.png
 | 
			
		||||
│      └─locale     # locale
 | 
			
		||||
│         ├─en-US
 | 
			
		||||
│         │      overlay.dtd
 | 
			
		||||
│         │
 | 
			
		||||
│         └─zh-CN
 | 
			
		||||
│                overlay.dtd
 | 
			
		||||
│
 | 
			
		||||
├─builds            # build dir
 | 
			
		||||
│  └─.xpi
 | 
			
		||||
@ -95,6 +240,7 @@ This section shows the directory structure of a template.
 | 
			
		||||
    │  module.ts    # module class
 | 
			
		||||
    │  addon.ts     # base class
 | 
			
		||||
    │  events.ts    # events class
 | 
			
		||||
    │  utils.ts     # Utils class
 | 
			
		||||
    │  views.ts     # UI class
 | 
			
		||||
    └─ prefs.ts     # preferences class
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user