Changeset 659

Show
Ignore:
Timestamp:
02/11/08 06:01:07 (10 months ago)
Author:
ma..@jesperkristensen.dk
Message:

Move script meta-data parsing from ScriptDownloader? to Config

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/config-service/src/chrome/chromeFiles/content/config.js

    r658 r659  
    134134}; 
    135135 
     136Config.prototype.parse = function(source, uri) 
     137{ 
     138  var ioservice = Components.classes["@mozilla.org/network/io-service;1"] 
     139                            .getService(Components.interfaces.nsIIOService); 
     140 
     141  var script = new Script(this); 
     142  script.enabled = true; 
     143  script.includes = []; 
     144  script.excludes = []; 
     145 
     146  // read one line at a time looking for start meta delimiter or EOF 
     147  var lines = source.match(/.+/g); 
     148  var lnIdx = 0; 
     149  var result = {}; 
     150  var foundMeta = false; 
     151 
     152  while ((result = lines[lnIdx++])) { 
     153    if (result.indexOf("// ==UserScript==") == 0) { 
     154      foundMeta = true; 
     155      break; 
     156    } 
     157  } 
     158 
     159  // gather up meta lines 
     160  if (foundMeta) { 
     161    // used for duplicate resource name detection 
     162    var previousResourceNames = {}; 
     163 
     164    while ((result = lines[lnIdx++])) { 
     165      if (result.indexOf("// ==/UserScript==") == 0) { 
     166        break; 
     167      } 
     168 
     169      var match = result.match(/\/\/ \@(\S+)\s+([^\n]+)/); 
     170      if (match != null) { 
     171        switch (match[1]) { 
     172          case "name": 
     173          case "namespace": 
     174          case "description": 
     175            script[match[1]] = match[2]; 
     176            break; 
     177          case "include": 
     178          case "exclude": 
     179            script[match[1]+"s"].push(match[2]); 
     180            break; 
     181          case "require": 
     182            var reqUri = ioservice.newURI(match[2], null, uri); 
     183            var scriptRequire = new ScriptRequire(script); 
     184            scriptRequire.url = reqUri.spec; 
     185            script.requires.push(scriptRequire); 
     186            break; 
     187          case "resource": 
     188            var res = match[2].match(/(\S+)\s+(.*)/); 
     189            if (res === null) { 
     190              // NOTE: Unlocalized strings 
     191              throw new Error("Invalid syntax for @resource declaration '" + 
     192                              match[2] + "'. Resources are declared like: " + 
     193                              "@resource <name> <url>."); 
     194            } 
     195 
     196            var resName = res[1]; 
     197            if (previousResourceNames[resName]) { 
     198              throw new Error("Duplicate resource name '" + resName + "' " + 
     199                              "detected. Each resource must have a unique " + 
     200                              "name."); 
     201            } else { 
     202              previousResourceNames[resName] = true; 
     203            } 
     204 
     205            var resUri = ioservice.newURI(res[2], null, uri); 
     206            var scriptResource = new ScriptResource(script); 
     207            scriptResource.name = resName; 
     208            scriptResource.url = resUri.spec; 
     209            script.resources.push(scriptResource); 
     210            break; 
     211        } 
     212      } 
     213    } 
     214  } 
     215 
     216  // if no meta info, default to reasonable values 
     217  if (script.name == null) { 
     218    script.name = parseScriptName(uri); 
     219  } 
     220 
     221  if (script.namespace == null) { 
     222    script.namespace = uri.host; 
     223  } 
     224 
     225  if (script.includes.length == 0) { 
     226    script.includes.push("*"); 
     227  } 
     228 
     229  return script; 
     230} 
     231 
    136232Config.prototype.install = function(script) { 
    137233  GM_log("> Config.install"); 
  • branches/config-service/src/chrome/chromeFiles/content/newscript.js

    r658 r659  
    3232 
    3333  // create a script object with parsed metadata, 
    34   // via the script downloader object 
    35   var sd = new ScriptDownloader(null, tempFile, null); 
    36   sd.parseScript(script, tempFile); 
    37   script = sd.script; 
     34  script = config.parse(script, tempFile); 
    3835 
    3936  // make sure entered details will not ruin an existing file 
  • branches/config-service/src/chrome/chromeFiles/content/scriptdownloader.js

    r655 r659  
    5353    var source = this.req_.responseText; 
    5454 
    55     this.parseScript(source, this.uri_); 
     55    var config = new Config(); // This is fragile, but temporary until config becomes a service 
     56    this.script = config.parse(source, this.uri_); 
    5657 
    5758    var file = Components.classes["@mozilla.org/file/directory_service;1"] 
     
    226227}; 
    227228 
    228 ScriptDownloader.prototype.parseScript = function(source, uri) { 
    229   var ioservice = Components.classes["@mozilla.org/network/io-service;1"] 
    230                             .getService(Components.interfaces.nsIIOService); 
    231  
    232   var config = new Config(); // This is fragile, but temporary until config becomes a service 
    233   var script = new Script(config); 
    234   script.enabled = true; 
    235   script.includes = []; 
    236   script.excludes = []; 
    237  
    238   // read one line at a time looking for start meta delimiter or EOF 
    239   var lines = source.match(/.+/g); 
    240   var lnIdx = 0; 
    241   var result = {}; 
    242   var foundMeta = false; 
    243  
    244   while ((result = lines[lnIdx++])) { 
    245     if (result.indexOf("// ==UserScript==") == 0) { 
    246       foundMeta = true; 
    247       break; 
    248     } 
    249   } 
    250  
    251   // gather up meta lines 
    252   if (foundMeta) { 
    253     // used for duplicate resource name detection 
    254     var previousResourceNames = {}; 
    255  
    256     while ((result = lines[lnIdx++])) { 
    257       if (result.indexOf("// ==/UserScript==") == 0) { 
    258         break; 
    259       } 
    260  
    261       var match = result.match(/\/\/ \@(\S+)\s+([^\n]+)/); 
    262       if (match != null) { 
    263         switch (match[1]) { 
    264           case "name": 
    265           case "namespace": 
    266           case "description": 
    267             script[match[1]] = match[2]; 
    268             break; 
    269           case "include": 
    270           case "exclude": 
    271             script[match[1]+"s"].push(match[2]); 
    272             break; 
    273           case "require": 
    274             var reqUri = ioservice.newURI(match[2], null, uri); 
    275             var scriptRequire = new ScriptRequire(script); 
    276             scriptRequire.url = reqUri.spec; 
    277             script.requires.push(scriptRequire); 
    278             break; 
    279           case "resource": 
    280             var res = match[2].match(/(\S+)\s+(.*)/); 
    281             if (res === null) { 
    282               // NOTE: Unlocalized strings 
    283               throw new Error("Invalid syntax for @resource declaration '" + 
    284                               match[2] + "'. Resources are declared like: " + 
    285                               "@resource <name> <url>."); 
    286             } 
    287  
    288             var resName = res[1]; 
    289             if (previousResourceNames[resName]) { 
    290               throw new Error("Duplicate resource name '" + resName + "' " + 
    291                               "detected. Each resource must have a unique " + 
    292                               "name."); 
    293             } else { 
    294               previousResourceNames[resName] = true; 
    295             } 
    296  
    297             var resUri = ioservice.newURI(res[2], null, uri); 
    298             var scriptResource = new ScriptResource(script); 
    299             scriptResource.name = resName; 
    300             scriptResource.url = resUri.spec; 
    301             script.resources.push(scriptResource); 
    302             break; 
    303         } 
    304       } 
    305     } 
    306   } 
    307  
    308   // if no meta info, default to reasonable values 
    309   if (script.name == null) { 
    310     script.name = parseScriptName(uri); 
    311   } 
    312  
    313   if (script.namespace == null) { 
    314     script.namespace = uri.host; 
    315   } 
    316  
    317   if (script.includes.length == 0) { 
    318     script.includes.push("*"); 
    319   } 
    320  
    321   this.script = script; 
    322 }; 
    323  
    324  
    325229function NotificationCallbacks() { 
    326230};