closes #267, MODS export option uses an rdf extension (should be xml)
thanks to Dan for the idea
This commit is contained in:
parent
7d93903e2d
commit
dd0c537ce1
|
@ -7,9 +7,8 @@
|
|||
// Class to provide options for export
|
||||
|
||||
var Scholar_File_Interface_Export = new function() {
|
||||
var _options;
|
||||
|
||||
this.init = init;
|
||||
this.updateOptions = updateOptions;
|
||||
this.accept = accept;
|
||||
this.cancel = cancel;
|
||||
|
||||
|
@ -17,29 +16,80 @@ var Scholar_File_Interface_Export = new function() {
|
|||
* add options to export
|
||||
*/
|
||||
function init() {
|
||||
_options = window.arguments[0].options;
|
||||
var addedOptions = new Object();
|
||||
|
||||
// add options to dialog
|
||||
var dialog = document.getElementById("scholar-export-options");
|
||||
for(var option in _options) {
|
||||
var defValue = _options[option];
|
||||
var translators = window.arguments[0].translators;
|
||||
|
||||
var listbox = document.getElementById("format-popup");
|
||||
var formatMenu = document.getElementById("format-menu");
|
||||
var optionsBox = document.getElementById("translator-options");
|
||||
|
||||
// add styles to list
|
||||
for(i in translators) {
|
||||
var itemNode = document.createElement("menuitem");
|
||||
itemNode.setAttribute("label", translators[i].label);
|
||||
listbox.appendChild(itemNode);
|
||||
|
||||
// get readable name for option
|
||||
try {
|
||||
var optionLabel = Scholar.getString("exportOptions."+option);
|
||||
} catch(e) {
|
||||
var optionLabel = option;
|
||||
// add options
|
||||
for(var option in translators[i].displayOptions) {
|
||||
if(!addedOptions[option]) { // if this option is not already
|
||||
// presented to the user
|
||||
// get readable name for option
|
||||
try {
|
||||
var optionLabel = Scholar.getString("exportOptions."+option);
|
||||
} catch(e) {
|
||||
var optionLabel = option;
|
||||
}
|
||||
|
||||
// right now, option interface supports only boolean values, which
|
||||
// it interprets as checkboxes
|
||||
if(typeof(translators[i].displayOptions[option]) == "boolean") {
|
||||
var checkbox = document.createElement("checkbox");
|
||||
checkbox.setAttribute("id", "export-option-"+option);
|
||||
checkbox.setAttribute("label", optionLabel);
|
||||
optionsBox.appendChild(checkbox);
|
||||
}
|
||||
|
||||
addedOptions[option] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// select first item by default
|
||||
if(formatMenu.selectedIndex == -1) {
|
||||
formatMenu.selectedIndex = 0;
|
||||
}
|
||||
|
||||
updateOptions();
|
||||
}
|
||||
|
||||
/*
|
||||
* update translator-specific options
|
||||
*/
|
||||
function updateOptions() {
|
||||
// get selected translator
|
||||
var index = document.getElementById("format-menu").selectedIndex;
|
||||
var translatorOptions = window.arguments[0].translators[index].displayOptions;
|
||||
|
||||
var optionsBox = document.getElementById("translator-options");
|
||||
for(var i=0; i<optionsBox.childNodes.length; i++) {
|
||||
// loop through options to see which should be enabled
|
||||
var node = optionsBox.childNodes[i];
|
||||
var optionName = node.getAttribute("id").toString().substr(14);
|
||||
|
||||
// right now, option interface supports only boolean values, which
|
||||
// it interprets as checkboxes
|
||||
Scholar.debug(option+" ("+optionLabel+") = "+defValue+" ("+typeof(defValue)+")");
|
||||
if(typeof(defValue) == "boolean") {
|
||||
var checkbox = document.createElement("checkbox");
|
||||
checkbox.setAttribute("id", option);
|
||||
checkbox.setAttribute("label", optionLabel);
|
||||
checkbox.setAttribute("checked", (defValue ? "true" : "false"));
|
||||
dialog.appendChild(checkbox);
|
||||
if(translatorOptions[optionName] != undefined) {
|
||||
// option should be enabled
|
||||
node.disabled = undefined;
|
||||
|
||||
var defValue = translatorOptions[optionName];
|
||||
if(typeof(defValue) == "boolean") {
|
||||
// if option exists, enable it and set to default value
|
||||
node.setAttribute("checked", (defValue ? "true" : "false"));
|
||||
}
|
||||
} else {
|
||||
// option should be disabled and unchecked to prevent confusion
|
||||
node.disabled = true;
|
||||
node.setAttribute("checked", "false");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -48,15 +98,21 @@ var Scholar_File_Interface_Export = new function() {
|
|||
* make option array reflect status
|
||||
*/
|
||||
function accept() {
|
||||
for(var option in _options) {
|
||||
var defValue = _options[option];
|
||||
var element = document.getElementById(option);
|
||||
// set selected translator
|
||||
var index = document.getElementById("format-menu").selectedIndex;
|
||||
window.arguments[0].selectedTranslator = window.arguments[0].translators[index];
|
||||
|
||||
// set options on selected translator
|
||||
var optionsAvailable = window.arguments[0].selectedTranslator.displayOptions;
|
||||
for(var option in optionsAvailable) {
|
||||
var defValue = optionsAvailable[option];
|
||||
var element = document.getElementById("export-option-"+option);
|
||||
|
||||
if(typeof(defValue) == "boolean") {
|
||||
if(element.checked == true) {
|
||||
_options[option] = true;
|
||||
optionsAvailable[option] = true;
|
||||
} else {
|
||||
_options[option] = false;
|
||||
optionsAvailable[option] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -66,6 +122,6 @@ var Scholar_File_Interface_Export = new function() {
|
|||
* make option array reflect status
|
||||
*/
|
||||
function cancel() {
|
||||
window.arguments[0].options = false;
|
||||
window.arguments[0].selectedTranslator = false;
|
||||
}
|
||||
}
|
|
@ -10,5 +10,14 @@
|
|||
|
||||
<script src="include.js"/>
|
||||
<script src="exportOptions.js"/>
|
||||
|
||||
<hbox>
|
||||
<label value="&exportOptions.format.label;" control="format-menu"/>
|
||||
<menulist id="format-menu" oncommand="Scholar_File_Interface_Export.updateOptions()">
|
||||
<menupopup id="format-popup">
|
||||
</menupopup>
|
||||
</menulist>
|
||||
</hbox>
|
||||
<groupbox id="translator-options">
|
||||
<caption label="&exportOptions.translatorOptions.label;"/>
|
||||
</groupbox>
|
||||
</dialog>
|
|
@ -15,27 +15,24 @@ var Scholar_File_Interface = new function() {
|
|||
var translation = new Scholar.Translate("export");
|
||||
var translators = translation.getTranslators();
|
||||
|
||||
// present options dialog
|
||||
var io = {translators:translators}
|
||||
window.openDialog("chrome://scholar/content/exportOptions.xul",
|
||||
"_blank", "chrome,modal,centerscreen", io);
|
||||
if(!io.selectedTranslator) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const nsIFilePicker = Components.interfaces.nsIFilePicker;
|
||||
var fp = Components.classes["@mozilla.org/filepicker;1"]
|
||||
.createInstance(nsIFilePicker);
|
||||
|
||||
fp.init(window, Scholar.getString("fileInterface.export"), nsIFilePicker.modeSave);
|
||||
|
||||
// set file name and extension.
|
||||
// set file name and extension
|
||||
name = (name ? name : Scholar.getString("pane.collections.library"));
|
||||
fp.defaultString = name+"."+translators[0].target;
|
||||
|
||||
// add save filters
|
||||
for(var i in translators) {
|
||||
var label = translators[i].label;
|
||||
|
||||
// put extensions in parentheses if Mac (Windows users already
|
||||
// get extension)
|
||||
label += " (."+translators[i].target+")";
|
||||
|
||||
fp.appendFilter(label, "*."+translators[i].target);
|
||||
}
|
||||
|
||||
fp.defaultString = name+"."+io.selectedTranslator.target;
|
||||
fp.appendFilter(io.selectedTranslator.label, "*."+io.selectedTranslator.target);
|
||||
|
||||
var rv = fp.show();
|
||||
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
|
||||
|
@ -43,8 +40,7 @@ var Scholar_File_Interface = new function() {
|
|||
translation.setItems(items);
|
||||
}
|
||||
translation.setLocation(fp.file);
|
||||
translation.setTranslator(translators[fp.filterIndex]);
|
||||
translation.setHandler("options", _exportOptions);
|
||||
translation.setTranslator(io.selectedTranslator);
|
||||
translation.setHandler("done", _exportDone);
|
||||
_disableUnresponsive();
|
||||
Scholar_File_Interface.Progress.show(
|
||||
|
@ -89,22 +85,6 @@ var Scholar_File_Interface = new function() {
|
|||
exportFile(Scholar.getString("fileInterface.exportedItems"), items);
|
||||
}
|
||||
|
||||
/*
|
||||
* closes items exported indicator
|
||||
*/
|
||||
function _exportOptions(obj, options) {
|
||||
var io = {options:options}
|
||||
window.openDialog("chrome://scholar/content/exportOptions.xul",
|
||||
"_blank","chrome,modal,centerscreen", io);
|
||||
if(io.options) {
|
||||
// refocus dialog
|
||||
Scholar_File_Interface.Progress.show();
|
||||
return options;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* closes items exported indicator
|
||||
*/
|
||||
|
|
|
@ -180,10 +180,7 @@ Scholar_Ingester_Interface.showPopup = function(collectionID, parentElement) {
|
|||
return false; // Don't dynamically reload popups that are already showing
|
||||
}
|
||||
Scholar_Ingester_Interface._scrapePopupShowing = true;
|
||||
|
||||
while(parentElement.hasChildNodes()) {
|
||||
parentElement.removeChild(parentElement.firstChild);
|
||||
}
|
||||
parentElement.removeAllItems();
|
||||
|
||||
if(collectionID == null) { // show library
|
||||
var newItem = document.createElement("menuitem");
|
||||
|
|
|
@ -246,6 +246,14 @@ Scholar.Translate.prototype.setString = function(string) {
|
|||
this._storagePointer = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* sets translator display options. you can also pass a translator (not ID) to
|
||||
* setTranslator that includes a displayOptions argument
|
||||
*/
|
||||
Scholar.Translate.prototype.setDisplayOptions = function(displayOptions) {
|
||||
this._setDisplayOptions = displayOptions;
|
||||
}
|
||||
|
||||
/*
|
||||
* sets the translator to be used for import/export
|
||||
*
|
||||
|
@ -256,8 +264,14 @@ Scholar.Translate.prototype.setTranslator = function(translator) {
|
|||
throw("cannot set translator: invalid value");
|
||||
}
|
||||
|
||||
this._setDisplayOptions = null;
|
||||
|
||||
if(typeof(translator) == "object") { // passed an object and not an ID
|
||||
if(translator.translatorID) {
|
||||
if(translator.displayOptions) {
|
||||
this._setDisplayOptions = translator.displayOptions;
|
||||
}
|
||||
|
||||
translator = [translator.translatorID];
|
||||
} else {
|
||||
// we have an associative array of translators
|
||||
|
@ -303,12 +317,6 @@ Scholar.Translate.prototype.setTranslator = function(translator) {
|
|||
*
|
||||
* as the first argument, all handlers will be passed the current function. the
|
||||
* second argument is dependent on the handler.
|
||||
*
|
||||
* options
|
||||
* valid: export
|
||||
* called: when options requiring user interaction are available
|
||||
* passed: an associative array of options and default values
|
||||
* returns: an associative array of options
|
||||
*
|
||||
* select
|
||||
* valid: web
|
||||
|
@ -372,22 +380,16 @@ Scholar.Translate.prototype.getTranslators = function() {
|
|||
var translators = Scholar.DB.query(sql);
|
||||
}
|
||||
|
||||
if(!this.location && !this.search) {
|
||||
return translators; // no need to see which can translate, because
|
||||
// we don't have a location yet (for export or
|
||||
// import dialog)
|
||||
} else {
|
||||
// create a new sandbox
|
||||
this._generateSandbox();
|
||||
|
||||
var possibleTranslators = new Array();
|
||||
Scholar.debug("searching for translators for "+this.path);
|
||||
|
||||
// see which translators can translate
|
||||
var possibleTranslators = this._findTranslators(translators);
|
||||
|
||||
return possibleTranslators;
|
||||
}
|
||||
// create a new sandbox
|
||||
this._generateSandbox();
|
||||
|
||||
var possibleTranslators = new Array();
|
||||
Scholar.debug("searching for translators for "+(this.path ? this.path : "an undisclosed location"));
|
||||
|
||||
// see which translators can translate
|
||||
var possibleTranslators = this._findTranslators(translators);
|
||||
|
||||
return possibleTranslators;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -408,6 +410,9 @@ Scholar.Translate.prototype._findTranslators = function(translators, ignoreExten
|
|||
label:translators[i].label,
|
||||
target:translators[i].target,
|
||||
itemType:translators[i].itemType}
|
||||
if(this.type == "export") {
|
||||
translator.displayOptions = this._displayOptions;
|
||||
}
|
||||
|
||||
possibleTranslators.push(translator);
|
||||
}
|
||||
|
@ -471,24 +476,16 @@ Scholar.Translate.prototype.translate = function() {
|
|||
return;
|
||||
}
|
||||
|
||||
if(this._setDisplayOptions) {
|
||||
this._displayOptions = this._setDisplayOptions;
|
||||
}
|
||||
|
||||
if(this._storage) {
|
||||
// enable reading from storage, which we can't do until the translator
|
||||
// is loaded
|
||||
this._storageFunctions(true);
|
||||
}
|
||||
|
||||
// hack to see if there are any options, bc length does not work on objects
|
||||
if(this.type == "export") {
|
||||
for(var i in this._displayOptions) {
|
||||
// run handler for options if there are any
|
||||
if(!(this._displayOptions = this._runHandler("options", this._displayOptions))) {
|
||||
this._translationComplete(true);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var returnValue;
|
||||
if(this.type == "web") {
|
||||
returnValue = this._web();
|
||||
|
|
|
@ -64,6 +64,8 @@
|
|||
<!ENTITY progress.title "Progress">
|
||||
|
||||
<!ENTITY exportOptions.title "Export...">
|
||||
<!ENTITY exportOptions.format.label "Format:">
|
||||
<!ENTITY exportOptions.translatorOptions.label "Translator Options">
|
||||
|
||||
<!ENTITY search.match "Match">
|
||||
<!ENTITY search.any "any">
|
||||
|
|
Loading…
Reference in New Issue
Block a user