add: preference compatibility for Zotero 6 & 7
This commit is contained in:
		
							parent
							
								
									583fbf166e
								
							
						
					
					
						commit
						1ab8af4ad2
					
				
							
								
								
									
										21
									
								
								addon/bootstrap.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								addon/bootstrap.js
									
									
									
									
										vendored
									
									
								
							@ -69,11 +69,12 @@ async function startup({ id, version, resourceURI, rootURI }, reason) {
 | 
				
			|||||||
    rootURI = resourceURI.spec;
 | 
					    rootURI = resourceURI.spec;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Services.scriptloader.loadSubScript(
 | 
					  const ctx = { Zotero, rootURI };
 | 
				
			||||||
    `${rootURI}/chrome/content/scripts/index.js`
 | 
					 | 
				
			||||||
  );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Zotero.AddonTemplate.rootURI = rootURI;
 | 
					  Services.scriptloader.loadSubScript(
 | 
				
			||||||
 | 
					    `${rootURI}/chrome/content/scripts/index.js`,
 | 
				
			||||||
 | 
					    ctx
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Zotero.platformMajorVersion >= 102) {
 | 
					  if (Zotero.platformMajorVersion >= 102) {
 | 
				
			||||||
    var aomStartup = Components.classes[
 | 
					    var aomStartup = Components.classes[
 | 
				
			||||||
@ -86,12 +87,12 @@ async function startup({ id, version, resourceURI, rootURI }, reason) {
 | 
				
			|||||||
      ["locale", "__addonRef__", "zh-CN", rootURI + "chrome/locale/zh-CN/"],
 | 
					      ["locale", "__addonRef__", "zh-CN", rootURI + "chrome/locale/zh-CN/"],
 | 
				
			||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Zotero.PreferencePanes.register({
 | 
					    // Zotero.PreferencePanes.register({
 | 
				
			||||||
      pluginID: "__addonID__",
 | 
					    //   pluginID: "__addonID__",
 | 
				
			||||||
      src: rootURI + "chrome/content/preferences.xhtml",
 | 
					    //   src: rootURI + "chrome/content/preferences.xhtml",
 | 
				
			||||||
      extraDTD: [`chrome://__addonRef__/locale/overlay.dtd`],
 | 
					    //   extraDTD: ["chrome://__addonRef__/locale/overlay.dtd"],
 | 
				
			||||||
      defaultXUL: true,
 | 
					    //   defaultXUL: true,
 | 
				
			||||||
    });
 | 
					    // });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,3 @@
 | 
				
			|||||||
content __addonRef__ chrome/content/
 | 
					content __addonRef__ chrome/content/
 | 
				
			||||||
skin __addonRef__ default	chrome/skin/default/__addonRef__/
 | 
					 | 
				
			||||||
locale __addonRef__ en-US chrome/locale/en-US/
 | 
					locale __addonRef__ en-US chrome/locale/en-US/
 | 
				
			||||||
locale __addonRef__ zh-CN chrome/locale/zh-CN/
 | 
					locale __addonRef__ zh-CN chrome/locale/zh-CN/
 | 
				
			||||||
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 677 B After Width: | Height: | Size: 677 B  | 
| 
		 Before Width: | Height: | Size: 836 B After Width: | Height: | Size: 836 B  | 
@ -6,8 +6,16 @@
 | 
				
			|||||||
    <label><html:h2>Addon Template Example</html:h2></label>
 | 
					    <label><html:h2>Addon Template Example</html:h2></label>
 | 
				
			||||||
    <checkbox
 | 
					    <checkbox
 | 
				
			||||||
      id="zotero-prefpane-__addonRef__-enable"
 | 
					      id="zotero-prefpane-__addonRef__-enable"
 | 
				
			||||||
      preference="pref-__addonRef__-enable"
 | 
					 | 
				
			||||||
      label="&zotero.__addonRef__.pref.enable.label;"
 | 
					      label="&zotero.__addonRef__.pref.enable.label;"
 | 
				
			||||||
    />
 | 
					    />
 | 
				
			||||||
 | 
					    <hbox>
 | 
				
			||||||
 | 
					      <html:input
 | 
				
			||||||
 | 
					        type="text"
 | 
				
			||||||
 | 
					        id="zotero-prefpane-__addonRef__-input"
 | 
				
			||||||
 | 
					      ></html:input>
 | 
				
			||||||
 | 
					      <html:label for="zotero-prefpane-__addonRef__-input"
 | 
				
			||||||
 | 
					        >&zotero.__addonRef__.pref.input.label;</html:label
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					    </hbox>
 | 
				
			||||||
  </groupbox>
 | 
					  </groupbox>
 | 
				
			||||||
</vbox>
 | 
					</vbox>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
<!ENTITY zotero.__addonRef__.itemmenu.test.label "addon template">
 | 
					<!ENTITY zotero.__addonRef__.itemmenu.test.label "addon template">
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.pref.enable.label "Enable">
 | 
					<!ENTITY zotero.__addonRef__.pref.enable.label "Enable">
 | 
				
			||||||
 | 
					<!ENTITY zotero.__addonRef__.pref.input.label "Input">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.help.version.label "__addonName__ VERSION __buildVersion__">
 | 
					<!ENTITY zotero.__addonRef__.help.version.label "__addonName__ VERSION __buildVersion__">
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.help.releasetime.label "Build __buildTime__">
 | 
					<!ENTITY zotero.__addonRef__.help.releasetime.label "Build __buildTime__">
 | 
				
			||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
<!ENTITY zotero.__addonRef__.itemmenu.test.label "插件模板">
 | 
					<!ENTITY zotero.__addonRef__.itemmenu.test.label "插件模板">
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.pref.enable.label "开启">
 | 
					<!ENTITY zotero.__addonRef__.pref.enable.label "开启">
 | 
				
			||||||
 | 
					<!ENTITY zotero.__addonRef__.pref.input.label "输入">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.help.version.label "__addonName__ 版本 __buildVersion__">
 | 
					<!ENTITY zotero.__addonRef__.help.version.label "__addonName__ 版本 __buildVersion__">
 | 
				
			||||||
<!ENTITY zotero.__addonRef__.help.releasetime.label "Build __buildTime__">
 | 
					<!ENTITY zotero.__addonRef__.help.releasetime.label "Build __buildTime__">
 | 
				
			||||||
@ -12,7 +12,7 @@
 | 
				
			|||||||
        em:creator="__author__"
 | 
					        em:creator="__author__"
 | 
				
			||||||
        em:description="__description__"
 | 
					        em:description="__description__"
 | 
				
			||||||
        em:homepageURL="__homepage__"
 | 
					        em:homepageURL="__homepage__"
 | 
				
			||||||
        em:iconURL="chrome://__addonRef__/skin/favicon.png"
 | 
					        em:iconURL="chrome://__addonRef__/content/icons/favicon.png"
 | 
				
			||||||
        em:optionsURL="chrome://__addonRef__/content/preferences.xul"
 | 
					        em:optionsURL="chrome://__addonRef__/content/preferences.xul"
 | 
				
			||||||
        em:updateURL="__updaterdf__"
 | 
					        em:updateURL="__updaterdf__"
 | 
				
			||||||
        em:multiprocessCompatible="true"
 | 
					        em:multiprocessCompatible="true"
 | 
				
			||||||
 | 
				
			|||||||
@ -5,8 +5,8 @@
 | 
				
			|||||||
  "description": "__description__",
 | 
					  "description": "__description__",
 | 
				
			||||||
  "author": "__author__",
 | 
					  "author": "__author__",
 | 
				
			||||||
  "icons": {
 | 
					  "icons": {
 | 
				
			||||||
    "48": "chrome/skin/default/__addonRef__/favicon@0.5x.png",
 | 
					    "48": "chrome/content/icons/favicon@0.5x.png",
 | 
				
			||||||
    "96": "chrome/skin/default/__addonRef__/favicon.png"
 | 
					    "96": "chrome/content/icons/favicon.png"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "applications": {
 | 
					  "applications": {
 | 
				
			||||||
    "zotero": {
 | 
					    "zotero": {
 | 
				
			||||||
 | 
				
			|||||||
@ -28,10 +28,11 @@ class AddonEvents extends AddonModule {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async onInit(_Zotero: _ZoteroConstructable) {
 | 
					  public async onInit(_Zotero: _ZoteroConstructable, rootURI) {
 | 
				
			||||||
    this._Addon.Zotero = _Zotero;
 | 
					    this._Addon.Zotero = _Zotero;
 | 
				
			||||||
 | 
					    this._Addon.rootURI = rootURI;
 | 
				
			||||||
    // This function is the setup code of the addon
 | 
					    // This function is the setup code of the addon
 | 
				
			||||||
    Zotero.debug(`${addonName}: init called`);
 | 
					    this._Addon.Utils.Tool.log(`${addonName}: init called`);
 | 
				
			||||||
    // alert(112233);
 | 
					    // alert(112233);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reset prefs
 | 
					    // Reset prefs
 | 
				
			||||||
@ -72,7 +73,7 @@ class AddonEvents extends AddonModule {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  public onUnInit(): void {
 | 
					  public onUnInit(): void {
 | 
				
			||||||
    const Zotero = this._Addon.Zotero;
 | 
					    const Zotero = this._Addon.Zotero;
 | 
				
			||||||
    Zotero.debug(`${addonName}: uninit called`);
 | 
					    this._Addon.Utils.Tool.log(`${addonName}: uninit called`);
 | 
				
			||||||
    //  Remove elements and do clean up
 | 
					    //  Remove elements and do clean up
 | 
				
			||||||
    this._Addon.views.unInitViews();
 | 
					    this._Addon.views.unInitViews();
 | 
				
			||||||
    // Remove addon object
 | 
					    // Remove addon object
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,7 @@
 | 
				
			|||||||
import Addon from "./addon";
 | 
					import Addon from "./addon";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Zotero = Components.classes["@zotero.org/Zotero;1"].getService(
 | 
					 | 
				
			||||||
  Components.interfaces.nsISupports
 | 
					 | 
				
			||||||
).wrappedJSObject;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if (!Zotero.AddonTemplate) {
 | 
					if (!Zotero.AddonTemplate) {
 | 
				
			||||||
  Zotero.AddonTemplate = new Addon();
 | 
					  Zotero.AddonTemplate = new Addon();
 | 
				
			||||||
  Zotero.AddonTemplate.events.onInit(Zotero);
 | 
					  // @ts-ignore
 | 
				
			||||||
 | 
					  Zotero.AddonTemplate.events.onInit(Zotero, rootURI);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										27
									
								
								src/prefs.ts
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/prefs.ts
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
				
			|||||||
import Addon from "./addon";
 | 
					import Addon from "./addon";
 | 
				
			||||||
import AddonModule from "./module";
 | 
					import AddonModule from "./module";
 | 
				
			||||||
import { addonName } from "../package.json";
 | 
					import { addonName, addonRef } from "../package.json";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AddonPrefs extends AddonModule {
 | 
					class AddonPrefs extends AddonModule {
 | 
				
			||||||
  private _window: Window;
 | 
					  private _window: Window;
 | 
				
			||||||
@ -11,15 +11,36 @@ class AddonPrefs extends AddonModule {
 | 
				
			|||||||
    // This function is called when the prefs window is opened
 | 
					    // This function is called when the prefs window is opened
 | 
				
			||||||
    // See addon/chrome/content/preferences.xul onpaneload
 | 
					    // See addon/chrome/content/preferences.xul onpaneload
 | 
				
			||||||
    this._window = _window;
 | 
					    this._window = _window;
 | 
				
			||||||
    Zotero.debug(`${addonName}: init preferences`);
 | 
					    this._Addon.Utils.Tool.log(`${addonName}: init preferences`);
 | 
				
			||||||
    this.updatePrefsUI();
 | 
					    this.updatePrefsUI();
 | 
				
			||||||
 | 
					    this.bindPrefEvents();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private updatePrefsUI() {
 | 
					  private updatePrefsUI() {
 | 
				
			||||||
    // You can initialize some UI elements on prefs window
 | 
					    // You can initialize some UI elements on prefs window
 | 
				
			||||||
    // with this._window.document
 | 
					    // with this._window.document
 | 
				
			||||||
    // Or bind some events to the elements
 | 
					    // Or bind some events to the elements
 | 
				
			||||||
    Zotero.debug(`${addonName}: init preferences UI`);
 | 
					    this._Addon.Utils.Tool.log(`${addonName}: init preferences UI`);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private bindPrefEvents() {
 | 
				
			||||||
 | 
					    this._window.document
 | 
				
			||||||
 | 
					      .querySelector(`#zotero-prefpane-${addonRef}-enable`)
 | 
				
			||||||
 | 
					      ?.addEventListener("command", (e) => {
 | 
				
			||||||
 | 
					        this._Addon.Utils.Tool.log(e);
 | 
				
			||||||
 | 
					        this._window.alert(
 | 
				
			||||||
 | 
					          `Successfully changed to ${(e.target as XUL.Checkbox).checked}!`
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this._window.document
 | 
				
			||||||
 | 
					      .querySelector(`#zotero-prefpane-${addonRef}-input`)
 | 
				
			||||||
 | 
					      ?.addEventListener("change", (e) => {
 | 
				
			||||||
 | 
					        this._Addon.Utils.Tool.log(e);
 | 
				
			||||||
 | 
					        this._window.alert(
 | 
				
			||||||
 | 
					          `Successfully changed to ${(e.target as HTMLInputElement).value}!`
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										124
									
								
								src/utils.ts
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								src/utils.ts
									
									
									
									
									
								
							@ -21,12 +21,19 @@ class AddonUtils extends AddonModule {
 | 
				
			|||||||
      // Check if it's running on Zotero 7 (Firefox 102)
 | 
					      // Check if it's running on Zotero 7 (Firefox 102)
 | 
				
			||||||
      isZotero7: () => Zotero.platformMajorVersion >= 102,
 | 
					      isZotero7: () => Zotero.platformMajorVersion >= 102,
 | 
				
			||||||
      // Firefox 102 support DOMParser natively
 | 
					      // Firefox 102 support DOMParser natively
 | 
				
			||||||
      getDOMParser: () =>
 | 
					      getDOMParser: () => {
 | 
				
			||||||
        this.Compat.isZotero7()
 | 
					        if (this.Compat.isZotero7()) {
 | 
				
			||||||
          ? new DOMParser()
 | 
					          return new DOMParser();
 | 
				
			||||||
          : Components.classes[
 | 
					        }
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					          return new (this.Compat.getZotero().getMainWindow().DOMParser)();
 | 
				
			||||||
 | 
					        } catch (e) {
 | 
				
			||||||
 | 
					          return Components.classes[
 | 
				
			||||||
            "@mozilla.org/xmlextras/domparser;1"
 | 
					            "@mozilla.org/xmlextras/domparser;1"
 | 
				
			||||||
            ].createInstance(Components.interfaces.nsIDOMParser),
 | 
					          ].createInstance(Components.interfaces.nsIDOMParser);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // create XUL element
 | 
					      // create XUL element
 | 
				
			||||||
      createXULElement: (doc: Document, type: string) => {
 | 
					      createXULElement: (doc: Document, type: string) => {
 | 
				
			||||||
        if (this.Compat.isZotero7()) {
 | 
					        if (this.Compat.isZotero7()) {
 | 
				
			||||||
@ -39,6 +46,111 @@ class AddonUtils extends AddonModule {
 | 
				
			|||||||
          ) as XUL.Element;
 | 
					          ) as XUL.Element;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      parseXHTMLToFragment: (
 | 
				
			||||||
 | 
					        str: string,
 | 
				
			||||||
 | 
					        entities: string[] = [],
 | 
				
			||||||
 | 
					        defaultXUL = true
 | 
				
			||||||
 | 
					      ) => {
 | 
				
			||||||
 | 
					        // Adapted from MozXULElement.parseXULToFragment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* eslint-disable indent */
 | 
				
			||||||
 | 
					        let parser = this.Compat.getDOMParser();
 | 
				
			||||||
 | 
					        // parser.forceEnableXULXBL();
 | 
				
			||||||
 | 
					        const xulns =
 | 
				
			||||||
 | 
					          "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
 | 
				
			||||||
 | 
					        const htmlns = "http://www.w3.org/1999/xhtml";
 | 
				
			||||||
 | 
					        const wrappedStr = `${
 | 
				
			||||||
 | 
					          entities.length
 | 
				
			||||||
 | 
					            ? `<!DOCTYPE bindings [ ${entities.reduce(
 | 
				
			||||||
 | 
					                (preamble, url, index) => {
 | 
				
			||||||
 | 
					                  return (
 | 
				
			||||||
 | 
					                    preamble +
 | 
				
			||||||
 | 
					                    `<!ENTITY % _dtd-${index} SYSTEM "${url}"> %_dtd-${index}; `
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                ""
 | 
				
			||||||
 | 
					              )}]>`
 | 
				
			||||||
 | 
					            : ""
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        <html:div xmlns="${defaultXUL ? xulns : htmlns}"
 | 
				
			||||||
 | 
					            xmlns:xul="${xulns}" xmlns:html="${htmlns}">
 | 
				
			||||||
 | 
					        ${str}
 | 
				
			||||||
 | 
					        </html:div>`;
 | 
				
			||||||
 | 
					        this.Tool.log(wrappedStr, parser);
 | 
				
			||||||
 | 
					        let doc = parser.parseFromString(wrappedStr, "text/xml");
 | 
				
			||||||
 | 
					        /* eslint-enable indent */
 | 
				
			||||||
 | 
					        console.log(doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (doc.documentElement.localName === "parsererror") {
 | 
				
			||||||
 | 
					          throw new Error("not well-formed XHTML");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // We use a range here so that we don't access the inner DOM elements from
 | 
				
			||||||
 | 
					        // JavaScript before they are imported and inserted into a document.
 | 
				
			||||||
 | 
					        let range = doc.createRange();
 | 
				
			||||||
 | 
					        range.selectNodeContents(doc.querySelector("div"));
 | 
				
			||||||
 | 
					        return range.extractContents();
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      prefPaneCache: { win: undefined, listeners: [], ids: [] },
 | 
				
			||||||
 | 
					      registerPrefPane: (options: PrefPaneOptions) => {
 | 
				
			||||||
 | 
					        const windowListener = {
 | 
				
			||||||
 | 
					          onOpenWindow: (xulWindow) => {
 | 
				
			||||||
 | 
					            const win: Window = xulWindow
 | 
				
			||||||
 | 
					              .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
 | 
				
			||||||
 | 
					              .getInterface(Components.interfaces.nsIDOMWindow);
 | 
				
			||||||
 | 
					            win.addEventListener(
 | 
				
			||||||
 | 
					              "load",
 | 
				
			||||||
 | 
					              async () => {
 | 
				
			||||||
 | 
					                if (
 | 
				
			||||||
 | 
					                  win.location.href ===
 | 
				
			||||||
 | 
					                  "chrome://zotero/content/preferences/preferences.xul"
 | 
				
			||||||
 | 
					                ) {
 | 
				
			||||||
 | 
					                  this.Tool.log("registerPrefPane:detected", options);
 | 
				
			||||||
 | 
					                  const Zotero = this.Compat.getZotero();
 | 
				
			||||||
 | 
					                  options.id || (options.id = `plugin-${new Date().getTime()}`);
 | 
				
			||||||
 | 
					                  const src = `<prefpane id="${
 | 
				
			||||||
 | 
					                    options.id
 | 
				
			||||||
 | 
					                  }" insertafter="zotero-prefpane-advanced" label="${
 | 
				
			||||||
 | 
					                    options.label || options.pluginID
 | 
				
			||||||
 | 
					                  }" image="${options.image || ""}">
 | 
				
			||||||
 | 
					                  ${(await Zotero.File.getContentsAsync(options.src)) as string}
 | 
				
			||||||
 | 
					                  </prefpane>`;
 | 
				
			||||||
 | 
					                  const frag = this.Compat.parseXHTMLToFragment(
 | 
				
			||||||
 | 
					                    src,
 | 
				
			||||||
 | 
					                    options.extraDTD,
 | 
				
			||||||
 | 
					                    options.defaultXUL
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					                  this.Tool.log(frag);
 | 
				
			||||||
 | 
					                  const prefWindow = win.document.querySelector("prefwindow");
 | 
				
			||||||
 | 
					                  prefWindow.appendChild(frag);
 | 
				
			||||||
 | 
					                  const prefPane = win.document.querySelector(`#${options.id}`);
 | 
				
			||||||
 | 
					                  // @ts-ignore
 | 
				
			||||||
 | 
					                  prefWindow.addPane(prefPane);
 | 
				
			||||||
 | 
					                  this.Compat.prefPaneCache.win = win;
 | 
				
			||||||
 | 
					                  this.Compat.prefPaneCache.listeners.push(windowListener);
 | 
				
			||||||
 | 
					                  this.Compat.prefPaneCache.ids.push(options.id);
 | 
				
			||||||
 | 
					                  if (options.onload) {
 | 
				
			||||||
 | 
					                    options.onload(win);
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              false
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        Services.wm.addListener(windowListener);
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      unregisterPrefPane: () => {
 | 
				
			||||||
 | 
					        this.Compat.prefPaneCache.listeners.forEach((l) =>
 | 
				
			||||||
 | 
					          Services.wm.removeListener(l)
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        const win = this.Compat.prefPaneCache.win;
 | 
				
			||||||
 | 
					        if (win && !win.closed) {
 | 
				
			||||||
 | 
					          this.Compat.prefPaneCache.ids.forEach((id) =>
 | 
				
			||||||
 | 
					            win.document.querySelector(id)?.remove()
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    this.Tool = {
 | 
					    this.Tool = {
 | 
				
			||||||
      getCopyHelper: () => new CopyHelper(),
 | 
					      getCopyHelper: () => new CopyHelper(),
 | 
				
			||||||
@ -84,7 +196,7 @@ class AddonUtils extends AddonModule {
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      log: (...data: any[]) => {
 | 
					      log: (...data: any[]) => {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
          this._Addon.Zotero.getMainWindow().console.log(data);
 | 
					          this._Addon.Zotero.getMainWindow().console.log(...data);
 | 
				
			||||||
          for (const d of data) {
 | 
					          for (const d of data) {
 | 
				
			||||||
            this._Addon.Zotero.debug(d);
 | 
					            this._Addon.Zotero.debug(d);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								src/views.ts
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/views.ts
									
									
									
									
									
								
							@ -11,7 +11,7 @@ class AddonViews extends AddonModule {
 | 
				
			|||||||
    this.progressWindowIcon = {
 | 
					    this.progressWindowIcon = {
 | 
				
			||||||
      success: "chrome://zotero/skin/tick.png",
 | 
					      success: "chrome://zotero/skin/tick.png",
 | 
				
			||||||
      fail: "chrome://zotero/skin/cross.png",
 | 
					      fail: "chrome://zotero/skin/cross.png",
 | 
				
			||||||
      default: `chrome://${addonRef}/skin/favicon.png`,
 | 
					      default: `chrome://${addonRef}/content/icons/favicon.png`,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -19,9 +19,9 @@ class AddonViews extends AddonModule {
 | 
				
			|||||||
    const Zotero = this._Addon.Zotero;
 | 
					    const Zotero = this._Addon.Zotero;
 | 
				
			||||||
    // You can init the UI elements that
 | 
					    // You can init the UI elements that
 | 
				
			||||||
    // cannot be initialized with overlay.xul
 | 
					    // cannot be initialized with overlay.xul
 | 
				
			||||||
    Zotero.debug("Initializing UI");
 | 
					    this._Addon.Utils.Tool.log("Initializing UI");
 | 
				
			||||||
    const menuIcon =
 | 
					    const menuIcon =
 | 
				
			||||||
      "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAC9klEQVQ4jU1TzW/UZRB+Zub9fexXt7s0YG0RAlTAg6EqjfUkMYYDN2OiJngxXOBEBP0T9KY3LiQe1JgYP4BEw0laBSGgSSVIYhNLw5cuaaXdbnf39/G+73jo/hommcxhMk9m5nkeUlUU4RQkBJ25kwRHv358LmAcEUbKRNxJfRAb8kbIqip1Mw2mn4nOMJ4IVWUAuHE/e3m1748IAyt9bxZXbPDCWHiJGa37qzZcz9SUAsK1e+kJowBtAoAIAEJDVcNAKaCZYweHzjPRyORo8P1fS/apwGBqZiGpzN5JT9UiEkPFLAAa1FCos5Z4fdBG9cf5ZO7geGhOX+y+Hwq1XhwLPv234z8UhjgFTGLBACoFiir828+Xb/etTnVT3TpSZrPw2D7993L+7njdLN5q5Tfnl+3JekRwCpgPLvW/AXAYQD7YQgwTanHUowj2P4eSC+W3Stz7dXtdzjngQCSAV1gAht77obdJAxPQy9VZjywOUFKFEkBeCZNbcWjhUd9+Mde73CwzVKEAiIXghaABw/VyxfSYHD+8y7yqCpQMaSzkmYDMYWhXw7R3NsxnTMgGz1dWgBWAVUgtpKUddfllelwe1SOayz3YKWgo5uy7W739H8+uff7sSHCtHNAp9VAhwAzu9pmDbB+mC/90/Ru/t3R07xb58vpDNxkbqFOloZhzJuz4eTE5GzB1haGdVJmL2zOn2NOUq3dX/XPtxB/aVqE/AFUCGAoOGL3hEi+N1qS7pUwaCdLXJ+JPDAC1HjIc03okuLKS6EPrcX5nnf9slni+m+u+1cTLsanq4pv7GnvbqTaEYBVAJFhnAnzugW0VvpA5vLKW6sXU4dvL9+w7E03+yroNhkLZqNWQ1qohdWohdQwTmAjqVLGnwT/dXnavhUIsBLS6+tZIiW74jR9t6l0BKpIIMF5hYkO4+sCeth67zcBe7VRfmr1rPyobuJUEknv4Qu6F5AGAAVwhAJnHfgWiouEVgVUc8AqphHRzosnXC8aedPD/kPxathRorWcAAAAASUVORK5CYII=";
 | 
					      'url("chrome://addontemplate/content/icons/favicon@0.5x.png")';
 | 
				
			||||||
    // item menuitem with icon
 | 
					    // item menuitem with icon
 | 
				
			||||||
    this._Addon.Utils.UI.insertMenuItem("item", {
 | 
					    this._Addon.Utils.UI.insertMenuItem("item", {
 | 
				
			||||||
      tag: "menuitem",
 | 
					      tag: "menuitem",
 | 
				
			||||||
@ -62,12 +62,32 @@ class AddonViews extends AddonModule {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  public initPrefs() {
 | 
					  public initPrefs() {
 | 
				
			||||||
    const Zotero = this._Addon.Zotero;
 | 
					    const Zotero = this._Addon.Zotero;
 | 
				
			||||||
 | 
					    this._Addon.Utils.Tool.log(this._Addon.rootURI);
 | 
				
			||||||
 | 
					    const prefOptions = {
 | 
				
			||||||
 | 
					      pluginID: addonID,
 | 
				
			||||||
 | 
					      src: this._Addon.rootURI + "chrome/content/preferences.xhtml",
 | 
				
			||||||
 | 
					      label: "Template",
 | 
				
			||||||
 | 
					      image: `chrome://${addonRef}/content/icons/favicon.png`,
 | 
				
			||||||
 | 
					      extraDTD: [`chrome://${addonRef}/locale/overlay.dtd`],
 | 
				
			||||||
 | 
					      defaultXUL: true,
 | 
				
			||||||
 | 
					      onload: (win: Window) => {
 | 
				
			||||||
 | 
					        this._Addon.prefs.initPreferences(win);
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    if (this._Addon.Utils.Compat.isZotero7()) {
 | 
				
			||||||
 | 
					      Zotero.PreferencePanes.register(prefOptions);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this._Addon.Utils.Compat.registerPrefPane(prefOptions);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public unInitViews() {
 | 
					  public unInitViews() {
 | 
				
			||||||
    const Zotero = this._Addon.Zotero;
 | 
					    const Zotero = this._Addon.Zotero;
 | 
				
			||||||
    Zotero.debug("Uninitializing UI");
 | 
					    this._Addon.Utils.Tool.log("Uninitializing UI");
 | 
				
			||||||
    this._Addon.Utils.UI.removeAddonElements();
 | 
					    this._Addon.Utils.UI.removeAddonElements();
 | 
				
			||||||
 | 
					    if (!this._Addon.Utils.Compat.isZotero7()) {
 | 
				
			||||||
 | 
					      this._Addon.Utils.Compat.unregisterPrefPane();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public showProgressWindow(
 | 
					  public showProgressWindow(
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								typing/global.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								typing/global.d.ts
									
									
									
									
										vendored
									
									
								
							@ -3,6 +3,14 @@ declare interface ZoteroCompat {
 | 
				
			|||||||
  isZotero7: () => boolean;
 | 
					  isZotero7: () => boolean;
 | 
				
			||||||
  getDOMParser: () => DOMParser;
 | 
					  getDOMParser: () => DOMParser;
 | 
				
			||||||
  createXULElement: (doc: Document, type: string) => XUL.Element;
 | 
					  createXULElement: (doc: Document, type: string) => XUL.Element;
 | 
				
			||||||
 | 
					  parseXHTMLToFragment: (
 | 
				
			||||||
 | 
					    str: string,
 | 
				
			||||||
 | 
					    entities: string[],
 | 
				
			||||||
 | 
					    defaultXUL?: boolean
 | 
				
			||||||
 | 
					  ) => DocumentFragment;
 | 
				
			||||||
 | 
					  prefPaneCache: { win: Window; listeners: any[]; ids: string[] };
 | 
				
			||||||
 | 
					  registerPrefPane: (options: PrefPaneOptions) => void;
 | 
				
			||||||
 | 
					  unregisterPrefPane: () => void;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare interface ZoteroTool {
 | 
					declare interface ZoteroTool {
 | 
				
			||||||
@ -79,6 +87,20 @@ declare interface MenuitemOptions {
 | 
				
			|||||||
  subElementOptions?: Array<MenuitemOptions>;
 | 
					  subElementOptions?: Array<MenuitemOptions>;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare interface PrefPaneOptions {
 | 
				
			||||||
 | 
					  pluginID: string;
 | 
				
			||||||
 | 
					  src: string;
 | 
				
			||||||
 | 
					  id?: string;
 | 
				
			||||||
 | 
					  parent?: string;
 | 
				
			||||||
 | 
					  label?: string;
 | 
				
			||||||
 | 
					  image?: string;
 | 
				
			||||||
 | 
					  extraDTD?: string[];
 | 
				
			||||||
 | 
					  scripts?: string[];
 | 
				
			||||||
 | 
					  defaultXUL?: boolean;
 | 
				
			||||||
 | 
					  // Only for Zotero 6
 | 
				
			||||||
 | 
					  onload?: (win: Window) => any;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare class CopyHelper {
 | 
					declare class CopyHelper {
 | 
				
			||||||
  addText: (source: string, type: "text/html" | "text/unicode") => CopyHelper;
 | 
					  addText: (source: string, type: "text/html" | "text/unicode") => CopyHelper;
 | 
				
			||||||
  addImage: (source: string) => CopyHelper;
 | 
					  addImage: (source: string) => CopyHelper;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user