home *** CD-ROM | disk | FTP | other *** search
- // DO NOT import this into the global namespace, but instead
- // import it into your own namespace wrapper
-
- var EXPORTED_SYMBOLS = ["CONTEXT_EXTRACTOR"];
-
- Components.utils.import("resource://glydo/utils/prototype_xul_1_6_0_3_modified.jsm");
- Components.utils.import("resource://glydo/utils/io.jsm");
- Components.utils.import("resource://glydo/utils/Prefs.jsm");
- Components.utils.import("resource://glydo/utils/Utils.jsm");
- Components.utils.import("resource://glydo/utils/ScriptManager.jsm");
- Components.utils.import("resource://glydo/application/extractors/BuiltinExtractors.jsm");
-
- const EXTRACTORS_JSON_RESOURCE_NAME="extractors.json";
-
- var ContextExtractor = Prototype.Class.create({
- initialize: function(scriptManager) {
- this.scriptManager = scriptManager;
- this.scriptManager.addListener(this);
- this.loadExtractors();
- },
-
- onResourcesUpdated: function(resourceNames) {
- if (resourceNames == null || resourceNames.indexOf(EXTRACTORS_JSON_RESOURCE_NAME) != -1) {
-
- this.loadExtractors();
- }
- },
-
- loadExtractors: function() {
- var json = this.scriptManager.getResource(EXTRACTORS_JSON_RESOURCE_NAME);
- if (!json) {
- this.extractorsParamsByDomain = {};
- } else {
- this.extractorsParamsByDomain = Prototype.S.decodeJSON(json);
- }
-
-
- },
-
-
-
-
- extract: function(doc,options) {
- var extractorsParams = this.getExtractorsParamsForDocument(doc);
- if (!extractorsParams) {
- return null;
- }
-
- var firstEx = this.getAllExtractorForParams(extractorsParams.extractors);
- var secondEx = this.getAllExtractorForParams(extractorsParams.fallbacks);
- var thirdEx = this.getAllExtractorForParams(Utils.arrayify(this.extractorsParamsByDomain["globalFallback"]));
- var ex = this.getFirstExtractorForParams([firstEx,secondEx,thirdEx]);
-
- var task = new ContextExtractor.Task(this.scriptManager,doc,ex,options,false);
- task.execute();
- return task;
- },
-
- getAllExtractorForParams: function(extractors) {
- if (!extractors) {
- return null;
- }
- var e = [];
- var l = extractors.length;
- for (var i = 0; i < l; ++i) {
- if (extractors[i]) {
- e.push(extractors[i]);
- }
- }
- if (e.length == 0) {
- return null;
- }
- if (e.length == 1) {
- return e[0];
- }
- return ({
- extractor: "com.glydo.extractors.builtins.all",
- options: {
- candidates: e
- },
- });
- },
-
- getFirstExtractorForParams: function(extractors) {
- if (!extractors) {
- return null;
- }
- var e = [];
- var l = extractors.length;
- for (var i = 0; i < l; ++i) {
- if (extractors[i]) {
- e.push(extractors[i]);
- }
- }
- if (e.length == 0) {
- return null;
- }
- if (e.length == 1) {
- return e[0];
- }
- return ({
- extractor: "com.glydo.extractors.builtins.first",
- options: {
- candidates: e,
- ignoreFailures: true
- }
- });
- },
-
- getExtractorsParamsForDocument: function(doc) {
- var extractors = [];
- var fallbacks = [];
- // Locate candidate extractors
- var url = doc.documentURI;
- var hld = Utils.getHighLevelDomainName(url).toLowerCase();
- var hldExtractors = this.extractorsParamsByDomain[hld];
- if (hldExtractors != undefined) {
- for (var re in hldExtractors) {
- var match = new RegExp(re).exec(url);
- if (match != null) {
- extractors.push.apply(extractors,Utils.arrayify(hldExtractors[re]));
- }
- }
- fallbacks.push.apply(fallbacks,Utils.arrayify(hldExtractors["fallback"]));
- } else {
- extractors.push.apply(extractors,Utils.arrayify(this.extractorsParamsByDomain["*"]));
- }
- return ({extractors: extractors, fallbacks: fallbacks});
- },
-
- });
-
- ContextExtractor.Task = Prototype.Class.create({
- initialize: function(scriptManager,doc,extractorParams,options) {
- this.document = doc;
- this.scriptManager = scriptManager;
- this.extractorParams = extractorParams;
- this.options = options;
- },
-
- execute: function() {
- // Find extractor code
- var id;
- var options;
- if (!this.extractorParams) {
- id = null;
- options = null;
- } else if (typeof this.extractorParams == "string") {
- id = this.extractorParams;
- options = null;
- } else {
- id = this.extractorParams["extractor"];
- options = this.extractorParams["options"];
- }
- if (!id) {
- this.taskFailed("No extractor id specified");
- return;
- }
- // Create arguments for extractor
- var callbacks = {};
- if (this.options["onContextItem"]) {
- callbacks["notifyContextItemExtracted"] = this.options["onContextItem"];
- }
- callbacks["notifyTaskDone"] = Prototype.F.bind(this.onTaskDone,this);
- callbacks["notifyTaskFailed"] = Prototype.F.bind(this.onTaskFailed,this);
-
- try {
- this.scriptManager.invoke(this.document,id,options,callbacks,[BuiltinExtractors]);
- } catch (ex) {
- var msg = (typeof ex == "string") ? ex : (ex.name + ": " + ex.message);
- this.onTaskFailed(ex);
-
- }
- },
-
- onTaskDone: function() {
- if (this.options["onCompleted"]) {
- try {
- this.options["onCompleted"]();
- } catch (ex) {
- if (Components) {
- Components.utils.reportError(ex);
- } else {
- throw ex;
- }
- }
- }
- },
-
- onTaskFailed: function(reason) {
- if (this.options["onFailure"]) {
- try {
- this.options["onFailure"](reason);
- } catch (ex) {
- if (Components) {
- Components.utils.reportError(ex);
- } else {
- throw ex;
- }
- }
- }
- },
-
- });
-
- var CONTEXT_EXTRACTOR = new ContextExtractor(SCRIPT_MANAGER);
-