====== Modifying Zotero Files======
Since Zotero is open-source software, you can make changes to the code yourself to add new features or adjust the behavior of current ones.
Most of the Zotero code is stored within the zotero.jar file in the //chrome// folder of the Zotero extension directory, located in the //extensions// subdirectory of the [[http://support.mozilla.com/en-us/kb/Profiles|Firefox profile]]. JAR files in Firefox are simply ZIP files, so you can extract the contents using any unzipping program, edit the files, and zip them back up. For performance reasons, it’s best not to use compression when zipping the files.
Note that **any changes you make to Zotero code will be lost the next time you upgrade to a new version**, so be sure to make copies of your changes---or better yet, create diff files so that you can more quickly patch new versions. You can also submit patches on the [[http://groups.google.com/group/zotero-dev|dev list]] for potential inclusion in future builds of Zotero. Many changes can also be implemented as separate Firefox extensions that either modify parts of Zotero or add new functionality using the Zotero Notifier and data API. For more information, see [[Interacting with Zotero from Within Firefox]].
===== A basic modification ======
Here's how you'd change the keystroke used to activate the Zotero pane using Terminal on a Mac. (The keystroke can be changed in the Zotero preferences, but this is an example of a simple change.)
% cd ~/Library/Application\ Support/Firefox/Profiles/
% ls -la
drwxr-xr-x 10 dan staff 340 Oct 7 11:24 .
drwxr-xr-x 6 dan staff 204 Feb 15 2006 ..
drwx------ 51 dan staff 1734 Oct 16 01:18 d2xizht4.2.0
drwx------ 59 dan staff 2006 Oct 8 21:47 ng6qa73p.1.5
drwx------ 32 dan staff 1088 Oct 13 17:46 oh3nnxos.Test
drwx------ 32 dan staff 1088 Oct 14 20:43 sfwx9etk.Trunk
drwx------ 33 dan staff 1122 Mar 24 2006 u28ujoyh.1.0
(Note that the profile directory is a random string---yours will be different from the example.)
% cd d2xizht4.2.0/extensions/zotero@chnm.gmu.edu/chrome
% unzip zotero.jar
creating: content/
creating: content/zotero/
extracting: content/zotero/about.xul
extracting: content/zotero/addCitationDialog.js
extracting: content/zotero/addCitationDialog.xul
extracting: content/zotero/bibliography.js
...etc...
% vi content/zotero/overlay.xul
Modify the file as desired. For this example, we'll change the //key// attribute of the element at the bottom of the overlay.xul file from "Z" to "O".
When you're done, save the file. Delete the old jar file, zip the files without compression (the -0 flag for the zip command) into a new jar in the parent directory, remove the unzipped directories, and move the jar back into place.
% rm zotero.jar
% zip -r0 ../zotero.jar *
adding: content/ (stored 0%)
adding: content/zotero/ (stored 0%)
adding: content/zotero/about.xul (stored 0%)
adding: content/zotero/addCitationDialog.js (stored 0%)
adding: content/zotero/addCitationDialog.xul (stored 0%)
...etc...
% rm -rf content locale skin
% mv ../zotero.jar .
That's it. The next time you start up Firefox, you can open the Zotero pane with command-option-o instead of command-option-z.
===== Longer-term Development =====
//Note: [[/support/dev/source_code#running_git_installations|Running Zotero from a Git clone]] is the recommended practice for long-term development.//
The above approach is fine for quick changes that don't require testing. However, for more involved changes, you'll want to tell Zotero to run using the uncompressed files rather than the jar file.((Production builds use a single JAR file because it improves caching and reduces the number of open file handles.)) This can be done by editing the paths in the first three lines of chrome.manifest in the root of the Zotero extension directory.
**Before**
content zotero jar:chrome/zotero.jar!/content/zotero/
locale zotero en-US jar:chrome/zotero.jar!/locale/en-US/zotero/
skin zotero default jar:chrome/zotero.jar!/skin/default/zotero/
overlay chrome://browser/content/browser.xul chrome://zotero/content/overlay.xul
overlay chrome://browser/content/browser.xul chrome://zotero/content/ingester/browser.xul
style chrome://browser/content/browser.xul chrome://zotero/skin/zotero.css
style chrome://global/content/customizeToolbar.xul chrome://zotero/skin/zotero.css
**After**
content zotero chrome/content/zotero/
locale zotero en-US chrome/locale/en-US/zotero/
skin zotero default chrome/skin/default/zotero/
overlay chrome://browser/content/browser.xul chrome://zotero/content/overlay.xul
overlay chrome://browser/content/browser.xul chrome://zotero/content/ingester/browser.xul
style chrome://browser/content/browser.xul chrome://zotero/skin/zotero.css
style chrome://global/content/customizeToolbar.xul chrome://zotero/skin/zotero.css
Now, extract the contents of zotero.jar. Changes you make to the extracted files in the newly created //content//, //locale// and //skin// directories will be reflected when you restart Firefox. You'll want to be sure that you've turned on **javascript.options.showInConsole** using the URL about:config and have the Error Console open as you test your changes.
For more information on coding within Zotero and Firefox, see [[Extension Files]] and [[Calling Zotero Processes From Within Firefox]].