www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 805d3ed6a67add126eff97579200458b52bf5ac5
parent 87e77593c389f2930cbfbd115f4ab2813adf6e66
Author: aurimasv <aurimas.dev@gmail.com>
Date:   Fri, 27 Apr 2012 01:53:00 -0500

Passed through jsbeutifier

Diffstat:
Mchrome/content/zotero/xpcom/rdf/identity.js | 677+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mchrome/content/zotero/xpcom/rdf/init.js | 48++++++++++++++++++++++++------------------------
Mchrome/content/zotero/xpcom/rdf/match.js | 170+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mchrome/content/zotero/xpcom/rdf/n3parser.js | 2131+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mchrome/content/zotero/xpcom/rdf/rdfparser.js | 1004++++++++++++++++++++++++++++++++++++++-----------------------------------------
Mchrome/content/zotero/xpcom/rdf/serialize.js | 1216++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mchrome/content/zotero/xpcom/rdf/term.js | 408++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mchrome/content/zotero/xpcom/rdf/uri.js | 209++++++++++++++++++++++++++++++++++++++++---------------------------------------
8 files changed, 2901 insertions(+), 2962 deletions(-)

diff --git a/chrome/content/zotero/xpcom/rdf/identity.js b/chrome/content/zotero/xpcom/rdf/identity.js @@ -12,505 +12,489 @@ // 2007 Changed so as not to munge statements from documents when smushing // // - -/*jsl:option explicit*/ // Turn on JavaScriptLint variable declaration checking - -$rdf.IndexedFormula = function() { - -var owl_ns = "http://www.w3.org/2002/07/owl#"; -// var link_ns = "http://www.w3.org/2007/ont/link#"; - -/* hashString functions are used as array indeces. This is done to avoid -** conflict with existing properties of arrays such as length and map. -** See issue 139. -*/ -$rdf.Literal.prototype.hashString = $rdf.Literal.prototype.toNT; -$rdf.Symbol.prototype.hashString = $rdf.Symbol.prototype.toNT; -$rdf.BlankNode.prototype.hashString = $rdf.BlankNode.prototype.toNT; -$rdf.Collection.prototype.hashString = $rdf.Collection.prototype.toNT; - - -//Stores an associative array that maps URIs to functions -$rdf.IndexedFormula = function(features) { - this.statements = []; // As in Formula +/*jsl:option explicit*/ +// Turn on JavaScriptLint variable declaration checking +$rdf.IndexedFormula = function () { + + var owl_ns = "http://www.w3.org/2002/07/owl#"; + // var link_ns = "http://www.w3.org/2007/ont/link#"; + /* hashString functions are used as array indeces. This is done to avoid + ** conflict with existing properties of arrays such as length and map. + ** See issue 139. + */ + $rdf.Literal.prototype.hashString = $rdf.Literal.prototype.toNT; + $rdf.Symbol.prototype.hashString = $rdf.Symbol.prototype.toNT; + $rdf.BlankNode.prototype.hashString = $rdf.BlankNode.prototype.toNT; + $rdf.Collection.prototype.hashString = $rdf.Collection.prototype.toNT; + + + //Stores an associative array that maps URIs to functions + $rdf.IndexedFormula = function (features) { + this.statements = []; // As in Formula this.optional = []; this.propertyActions = []; // Array of functions to call when getting statement with {s X o} //maps <uri> to [f(F,s,p,o),...] - this.classActions = []; // Array of functions to call when adding { s type X } - this.redirections = []; // redirect to lexically smaller equivalent symbol - this.aliases = []; // reverse mapping to redirection: aliases for this + this.classActions = []; // Array of functions to call when adding { s type X } + this.redirections = []; // redirect to lexically smaller equivalent symbol + this.aliases = []; // reverse mapping to redirection: aliases for this this.HTTPRedirects = []; // redirections we got from HTTP - this.subjectIndex = []; // Array of statements with this X as subject - this.predicateIndex = []; // Array of statements with this X as subject - this.objectIndex = []; // Array of statements with this X as object - this.whyIndex = []; // Array of statements with X as provenance - this.index = [ this.subjectIndex, this.predicateIndex, this.objectIndex, this.whyIndex ]; + this.subjectIndex = []; // Array of statements with this X as subject + this.predicateIndex = []; // Array of statements with this X as subject + this.objectIndex = []; // Array of statements with this X as object + this.whyIndex = []; // Array of statements with X as provenance + this.index = [this.subjectIndex, this.predicateIndex, this.objectIndex, this.whyIndex]; this.namespaces = {} // Dictionary of namespace prefixes - if (features === undefined) features = ["sameAs", - "InverseFunctionalProperty", "FunctionalProperty"]; -// this.features = features + if(features === undefined) features = ["sameAs", + "InverseFunctionalProperty", "FunctionalProperty"]; + // this.features = features // Callbackify? function handleRDFType(formula, subj, pred, obj, why) { - if (formula.typeCallback != undefined) - formula.typeCallback(formula, obj, why); - - var x = formula.classActions[obj.hashString()]; - var done = false; - if (x) { - for (var i=0; i<x.length; i++) { - done = done || x[i](formula, subj, pred, obj, why); - } + if(formula.typeCallback != undefined) + formula.typeCallback(formula, obj, why); + + var x = formula.classActions[obj.hashString()]; + var done = false; + if(x) { + for(var i = 0; i < x.length; i++) { + done = done || x[i](formula, subj, pred, obj, why); } - return done; // statement given is not needed if true + } + return done; // statement given is not needed if true } //handleRDFType - //If the predicate is #type, use handleRDFType to create a typeCallback on the object - this.propertyActions[ - '<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>'] = [ handleRDFType ]; + this.propertyActions['<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>'] = [handleRDFType]; // Assumption: these terms are not redirected @@fixme - if ($rdf.Util.ArrayIndexOf(features,"sameAs") >= 0) - this.propertyActions['<http://www.w3.org/2002/07/owl#sameAs>'] = [ - function(formula, subj, pred, obj, why) { - // tabulator.log.warn("Equating "+subj.uri+" sameAs "+obj.uri); //@@ - formula.equate(subj,obj); - return true; // true if statement given is NOT needed in the store - }]; //sameAs -> equate & don't add to index - - if ($rdf.Util.ArrayIndexOf(features,"InverseFunctionalProperty") >= 0) - this.classActions["<"+owl_ns+"InverseFunctionalProperty>"] = [ - function(formula, subj, pred, obj, addFn) { - return formula.newPropertyAction(subj, handle_IFP); // yes subj not pred! - }]; //IFP -> handle_IFP, do add to index - - if ($rdf.Util.ArrayIndexOf(features,"FunctionalProperty") >= 0) - this.classActions["<"+owl_ns+"FunctionalProperty>"] = [ - function(formula, subj, proj, obj, addFn) { - return formula.newPropertyAction(subj, handle_FP); - }]; //FP => handleFP, do add to index - - function handle_IFP(formula, subj, pred, obj) { - var s1 = formula.any(undefined, pred, obj); - if (s1 == undefined) return false; // First time with this value - // tabulator.log.warn("Equating "+s1.uri+" and "+subj.uri + " because IFP "+pred.uri); //@@ - formula.equate(s1, subj); - return true; + if($rdf.Util.ArrayIndexOf(features, "sameAs") >= 0) + this.propertyActions['<http://www.w3.org/2002/07/owl#sameAs>'] = [ + function (formula, subj, pred, obj, why) { + // tabulator.log.warn("Equating "+subj.uri+" sameAs "+obj.uri); //@@ + formula.equate(subj, obj); + return true; // true if statement given is NOT needed in the store + }]; //sameAs -> equate & don't add to index + if($rdf.Util.ArrayIndexOf(features, "InverseFunctionalProperty") >= 0) + this.classActions["<" + owl_ns + "InverseFunctionalProperty>"] = [ + function (formula, subj, pred, obj, addFn) { + return formula.newPropertyAction(subj, handle_IFP); // yes subj not pred! + }]; //IFP -> handle_IFP, do add to index + if($rdf.Util.ArrayIndexOf(features, "FunctionalProperty") >= 0) + this.classActions["<" + owl_ns + "FunctionalProperty>"] = [ + function (formula, subj, proj, obj, addFn) { + return formula.newPropertyAction(subj, handle_FP); + } + ]; //FP => handleFP, do add to index + function handle_IFP(formula, subj, pred, obj) { + var s1 = formula.any(undefined, pred, obj); + if(s1 == undefined) return false; // First time with this value + // tabulator.log.warn("Equating "+s1.uri+" and "+subj.uri + " because IFP "+pred.uri); //@@ + formula.equate(s1, subj); + return true; } //handle_IFP - - function handle_FP(formula, subj, pred, obj) { - var o1 = formula.any(subj, pred, undefined); - if (o1 == undefined) return false; // First time with this value - // tabulator.log.warn("Equating "+o1.uri+" and "+obj.uri + " because FP "+pred.uri); //@@ - formula.equate(o1, obj); - return true ; + function handle_FP(formula, subj, pred, obj) { + var o1 = formula.any(subj, pred, undefined); + if(o1 == undefined) return false; // First time with this value + // tabulator.log.warn("Equating "+o1.uri+" and "+obj.uri + " because FP "+pred.uri); //@@ + formula.equate(o1, obj); + return true; } //handle_FP + } /* end IndexedFormula */ -} /* end IndexedFormula */ - -$rdf.IndexedFormula.prototype = new $rdf.Formula(); -$rdf.IndexedFormula.prototype.constructor = $rdf.IndexedFormula; -$rdf.IndexedFormula.SuperClass = $rdf.Formula; + $rdf.IndexedFormula.prototype = new $rdf.Formula(); + $rdf.IndexedFormula.prototype.constructor = $rdf.IndexedFormula; + $rdf.IndexedFormula.SuperClass = $rdf.Formula; -$rdf.IndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) { + $rdf.IndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) { //$rdf.log.debug("newPropertyAction: "+pred); var hash = pred.hashString(); - if (this.propertyActions[hash] == undefined) - this.propertyActions[hash] = []; + if(this.propertyActions[hash] == undefined) + this.propertyActions[hash] = []; this.propertyActions[hash].push(action); // Now apply the function to to statements already in the store var toBeFixed = this.statementsMatching(undefined, pred, undefined); var done = false; - for (var i=0; i<toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc - done = done || action(this, toBeFixed[i].subject, pred, toBeFixed[i].object); + for(var i = 0; i < toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc + done = done || action(this, toBeFixed[i].subject, pred, toBeFixed[i].object); } return done; -} + } -$rdf.IndexedFormula.prototype.setPrefixForURI = function(prefix, nsuri) { + $rdf.IndexedFormula.prototype.setPrefixForURI = function (prefix, nsuri) { //TODO:This is a hack for our own issues, which ought to be fixed post-release //See http://dig.csail.mit.edu/cgi-bin/roundup.cgi/$rdf/issue227 - if(prefix=="tab" && this.namespaces["tab"]) { - return; + if(prefix == "tab" && this.namespaces["tab"]) { + return; } this.namespaces[prefix] = nsuri -} + } -// Deprocated ... name too generic -$rdf.IndexedFormula.prototype.register = function(prefix, nsuri) { + // Deprocated ... name too generic + $rdf.IndexedFormula.prototype.register = function (prefix, nsuri) { this.namespaces[prefix] = nsuri -} + } -/** simplify graph in store when we realize two identifiers are equivalent + /** simplify graph in store when we realize two identifiers are equivalent We replace the bigger with the smaller. */ -$rdf.IndexedFormula.prototype.equate = function(u1, u2) { + $rdf.IndexedFormula.prototype.equate = function (u1, u2) { // tabulator.log.warn("Equating "+u1+" and "+u2); // @@ //@@JAMBO Must canonicalize the uris to prevent errors from a=b=c //03-21-2010 - u1 = this.canon( u1 ); - u2 = this.canon( u2 ); + u1 = this.canon(u1); + u2 = this.canon(u2); var d = u1.compareTerm(u2); - if (!d) return true; // No information in {a = a} + if(!d) return true; // No information in {a = a} var big, small; - if (d < 0) { // u1 less than u2 - return this.replaceWith(u2, u1); + if(d < 0) { // u1 less than u2 + return this.replaceWith(u2, u1); } else { - return this.replaceWith(u1, u2); + return this.replaceWith(u1, u2); } -} + } -// Replace big with small, obsoleted with obsoleting. -// -$rdf.IndexedFormula.prototype.replaceWith = function(big, small) { + // Replace big with small, obsoleted with obsoleting. + // + $rdf.IndexedFormula.prototype.replaceWith = function (big, small) { //$rdf.log.debug("Replacing "+big+" with "+small) // @@ var oldhash = big.hashString(); var newhash = small.hashString(); - var moveIndex = function(ix) { + var moveIndex = function (ix) { var oldlist = ix[oldhash]; - if (oldlist == undefined) return; // none to move + if(oldlist == undefined) return; // none to move var newlist = ix[newhash]; - if (newlist == undefined) { - ix[newhash] = oldlist; + if(newlist == undefined) { + ix[newhash] = oldlist; } else { - ix[newhash] = oldlist.concat(newlist); + ix[newhash] = oldlist.concat(newlist); } - delete ix[oldhash]; - } - - // the canonical one carries all the indexes - for (var i=0; i<4; i++) { - moveIndex(this.index[i]); + delete ix[oldhash]; + } + + // the canonical one carries all the indexes + for(var i = 0; i < 4; i++) { + moveIndex(this.index[i]); } this.redirections[oldhash] = small; - if (big.uri) { - //@@JAMBO: must update redirections,aliases from sub-items, too. - if (this.aliases[newhash] == undefined) - this.aliases[newhash] = []; - this.aliases[newhash].push(big); // Back link - - if( this.aliases[oldhash] ) { - for( var i = 0; i < this.aliases[oldhash].length; i++ ) { - this.redirections[this.aliases[oldhash][i].hashString()] = small; - this.aliases[newhash].push(this.aliases[oldhash][i]); - } + if(big.uri) { + //@@JAMBO: must update redirections,aliases from sub-items, too. + if(this.aliases[newhash] == undefined) + this.aliases[newhash] = []; + this.aliases[newhash].push(big); // Back link + if(this.aliases[oldhash]) { + for(var i = 0; i < this.aliases[oldhash].length; i++) { + this.redirections[this.aliases[oldhash][i].hashString()] = small; + this.aliases[newhash].push(this.aliases[oldhash][i]); } - - this.add(small, this.sym('http://www.w3.org/2007/ont/link#uri'), big.uri) - - // If two things are equal, and one is requested, we should request the other. - if (this.sf) { - this.sf.nowKnownAs(big, small) - } + } + + this.add(small, this.sym('http://www.w3.org/2007/ont/link#uri'), big.uri) + + // If two things are equal, and one is requested, we should request the other. + if(this.sf) { + this.sf.nowKnownAs(big, small) + } } - + moveIndex(this.classActions); moveIndex(this.propertyActions); //$rdf.log.debug("Equate done. "+big+" to be known as "+small) - return true; // true means the statement does not need to be put in -}; + return true; // true means the statement does not need to be put in + }; -// Return the symbol with canonical URI as smushed -$rdf.IndexedFormula.prototype.canon = function(term) { - if (term == undefined) return term; + // Return the symbol with canonical URI as smushed + $rdf.IndexedFormula.prototype.canon = function (term) { + if(term == undefined) return term; var y = this.redirections[term.hashString()]; - if (y == undefined) return term; + if(y == undefined) return term; return y; -} + } -// Compare by canonical URI as smushed -$rdf.IndexedFormula.prototype.sameThings = function(x, y) { - if (x.sameTerm(y)) return true; + // Compare by canonical URI as smushed + $rdf.IndexedFormula.prototype.sameThings = function (x, y) { + if(x.sameTerm(y)) return true; var x1 = this.canon(x); -// alert('x1='+x1); - if (x1 == undefined) return false; + // alert('x1='+x1); + if(x1 == undefined) return false; var y1 = this.canon(y); -// alert('y1='+y1); //@@ - if (y1 == undefined) return false; - return (x1.uri == y1.uri); -} + // alert('y1='+y1); //@@ + if(y1 == undefined) return false; + return(x1.uri == y1.uri); + } -// A list of all the URIs by which this thing is known -$rdf.IndexedFormula.prototype.uris = function(term) { + // A list of all the URIs by which this thing is known + $rdf.IndexedFormula.prototype.uris = function (term) { var cterm = this.canon(term) var terms = this.aliases[cterm.hashString()]; - if (!cterm.uri) return [] - var res = [ cterm.uri ] - if (terms != undefined) { - for (var i=0; i<terms.length; i++) { - res.push(terms[i].uri) - } + if(!cterm.uri) return [] + var res = [cterm.uri] + if(terms != undefined) { + for(var i = 0; i < terms.length; i++) { + res.push(terms[i].uri) + } } return res -} - -// On input parameters, convert constants to terms -// -function RDFMakeTerm(formula,val, canonicalize) { - if (typeof val != 'object') { - if (typeof val == 'string') - return new $rdf.Literal(val); - if (typeof val == 'number') - return new $rdf.Literal(val); // @@ differet types - if (typeof val == 'boolean') - return new $rdf.Literal(val?"1":"0", undefined, - $rdf.Symbol.prototype.XSDboolean); - else if (typeof val == 'number') - return new $rdf.Literal(''+val); // @@ datatypes - else if (typeof val == 'undefined') - return undefined; - else // @@ add converting of dates and numbers - throw "Can't make Term from " + val + " of type " + typeof val; + } + + // On input parameters, convert constants to terms + // + function RDFMakeTerm(formula, val, canonicalize) { + if(typeof val != 'object') { + if(typeof val == 'string') + return new $rdf.Literal(val); + if(typeof val == 'number') + return new $rdf.Literal(val); // @@ differet types + if(typeof val == 'boolean') + return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); + else if(typeof val == 'number') + return new $rdf.Literal('' + val); // @@ datatypes + else if(typeof val == 'undefined') + return undefined; + else // @@ add converting of dates and numbers + throw "Can't make Term from " + val + " of type " + typeof val; } return val; -} - -// Add a triple to the store -// -// Returns the statement added -// (would it be better to return the original formula for chaining?) -// -$rdf.IndexedFormula.prototype.add = function(subj, pred, obj, why) { + } + + // Add a triple to the store + // + // Returns the statement added + // (would it be better to return the original formula for chaining?) + // + $rdf.IndexedFormula.prototype.add = function (subj, pred, obj, why) { var actions, st; - if (why == undefined) why = this.fetcher ? this.fetcher.appNode: this.sym("chrome:theSession"); //system generated - //defined in source.js, is this OK with identity.js only user? + if(why == undefined) why = this.fetcher ? this.fetcher.appNode : this.sym("chrome:theSession"); //system generated + //defined in source.js, is this OK with identity.js only user? subj = RDFMakeTerm(this, subj); pred = RDFMakeTerm(this, pred); obj = RDFMakeTerm(this, obj); why = RDFMakeTerm(this, why); - - var hash = [ this.canon(subj).hashString(), this.canon(pred).hashString(), - this.canon(obj).hashString(), this.canon(why).hashString()]; + var hash = [this.canon(subj).hashString(), this.canon(pred).hashString(), + this.canon(obj).hashString(), this.canon(why).hashString()]; + + + if(this.predicateCallback != undefined) + this.predicateCallback(this, pred, why); - if (this.predicateCallback != undefined) - this.predicateCallback(this, pred, why); - // Action return true if the statement does not need to be added var actions = this.propertyActions[hash[1]]; // Predicate hash var done = false; - if (actions) { - // alert('type: '+typeof actions +' @@ actions='+actions); - for (var i=0; i<actions.length; i++) { - done = done || actions[i](this, subj, pred, obj, why); - } + if(actions) { + // alert('type: '+typeof actions +' @@ actions='+actions); + for(var i = 0; i < actions.length; i++) { + done = done || actions[i](this, subj, pred, obj, why); + } } - + //If we are tracking provenanance, every thing should be loaded into the store //if (done) return new Statement(subj, pred, obj, why); // Don't put it in the store - // still return this statement for owl:sameAs input + // still return this statement for owl:sameAs input var st = new $rdf.Statement(subj, pred, obj, why); - for (var i=0; i<4; i++) { - var ix = this.index[i]; - var h = hash[i]; - if (ix[h] == undefined) ix[h] = []; - ix[h].push(st); // Set of things with this as subject, etc + for(var i = 0; i < 4; i++) { + var ix = this.index[i]; + var h = hash[i]; + if(ix[h] == undefined) ix[h] = []; + ix[h].push(st); // Set of things with this as subject, etc } - + //$rdf.log.debug("ADDING {"+subj+" "+pred+" "+obj+"} "+why); this.statements.push(st); return st; -}; //add - - -// Find out whether a given URI is used as symbol in the formula -$rdf.IndexedFormula.prototype.mentionsURI = function(uri) { + }; //add + // Find out whether a given URI is used as symbol in the formula + $rdf.IndexedFormula.prototype.mentionsURI = function (uri) { var hash = '<' + uri + '>'; - return (!!this.subjectIndex[hash] || !!this.objectIndex[hash] - || !!this.predicateIndex[hash]); -} - -// Find an unused id for a file being edited: return a symbol -// (Note: Slow iff a lot of them -- could be O(log(k)) ) -$rdf.IndexedFormula.prototype.nextSymbol = function(doc) { - for(var i=0;;i++) { - var uri = doc.uri + '#n' + i; - if (!this.mentionsURI(uri)) return this.sym(uri); + return (!!this.subjectIndex[hash] + || !!this.objectIndex[hash] + || !!this.predicateIndex[hash]); + } + + // Find an unused id for a file being edited: return a symbol + // (Note: Slow iff a lot of them -- could be O(log(k)) ) + $rdf.IndexedFormula.prototype.nextSymbol = function (doc) { + for(var i = 0;; i++) { + var uri = doc.uri + '#n' + i; + if(!this.mentionsURI(uri)) return this.sym(uri); } -} + } -$rdf.IndexedFormula.prototype.anyStatementMatching = function(subj,pred,obj,why) { - var x = this.statementsMatching(subj,pred,obj,why,true); - if (!x || x == []) return undefined; + $rdf.IndexedFormula.prototype.anyStatementMatching = function (subj, pred, obj, why) { + var x = this.statementsMatching(subj, pred, obj, why, true); + if(!x || x == []) return undefined; return x[0]; -}; + }; -// Return statements matching a pattern -// ALL CONVENIENCE LOOKUP FUNCTIONS RELY ON THIS! -$rdf.IndexedFormula.prototype.statementsMatching = function(subj,pred,obj,why,justOne) { + // Return statements matching a pattern + // ALL CONVENIENCE LOOKUP FUNCTIONS RELY ON THIS! + $rdf.IndexedFormula.prototype.statementsMatching = function (subj, pred, obj, why, justOne) { //$rdf.log.debug("Matching {"+subj+" "+pred+" "+obj+"}"); - - var pat = [ subj, pred, obj, why ]; + var pat = [subj, pred, obj, why]; var pattern = []; var hash = []; var wild = []; // wildcards var given = []; // Not wild - for (var p=0; p<4; p++) { - pattern[p] = this.canon(RDFMakeTerm(this, pat[p])); - if (pattern[p] == undefined) { - wild.push(p); - } else { - given.push(p); - hash[p] = pattern[p].hashString(); - } + for(var p = 0; p < 4; p++) { + pattern[p] = this.canon(RDFMakeTerm(this, pat[p])); + if(pattern[p] == undefined) { + wild.push(p); + } else { + given.push(p); + hash[p] = pattern[p].hashString(); + } } - if (given.length == 0) { - return this.statements; + if(given.length == 0) { + return this.statements; } - if (given.length == 1) { // Easy too, we have an index for that - var p = given[0]; - var list = this.index[p][hash[p]]; - if(list && justOne) { - if(list.length>1) - list = list.slice(0,1); - } - return list == undefined ? [] : list; + if(given.length == 1) { // Easy too, we have an index for that + var p = given[0]; + var list = this.index[p][hash[p]]; + if(list && justOne) { + if(list.length > 1) + list = list.slice(0, 1); + } + return list == undefined ? [] : list; } - + // Now given.length is 2, 3 or 4. // We hope that the scale-free nature of the data will mean we tend to get // a short index in there somewhere! - var best = 1e10; // really bad var best_i; - for (var i=0; i<given.length; i++) { - var p = given[i]; // Which part we are dealing with - var list = this.index[p][hash[p]]; - if (list == undefined) return []; // No occurrences - if (list.length < best) { - best = list.length; - best_i = i; // (not p!) - } + for(var i = 0; i < given.length; i++) { + var p = given[i]; // Which part we are dealing with + var list = this.index[p][hash[p]]; + if(list == undefined) return []; // No occurrences + if(list.length < best) { + best = list.length; + best_i = i; // (not p!) + } } - + // Ok, we have picked the shortest index but now we have to filter it var best_p = given[best_i]; var possibles = this.index[best_p][hash[best_p]]; - var check = given.slice(0, best_i).concat(given.slice(best_i+1)) // remove best_i + var check = given.slice(0, best_i).concat(given.slice(best_i + 1)) // remove best_i var results = []; - var parts = [ 'subject', 'predicate', 'object', 'why']; - for (var j=0; j<possibles.length; j++) { - var st = possibles[j]; - for (var i=0; i <check.length; i++) { // for each position to be checked - var p = check[i]; - if (!this.canon(st[parts[p]]).sameTerm(pattern[p])) { - st = null; - break; - } + var parts = ['subject', 'predicate', 'object', 'why']; + for(var j = 0; j < possibles.length; j++) { + var st = possibles[j]; + for(var i = 0; i < check.length; i++) { // for each position to be checked + var p = check[i]; + if(!this.canon(st[parts[p]]).sameTerm(pattern[p])) { + st = null; + break; } - if (st != null) results.push(st); + } + if(st != null) results.push(st); } if(justOne) { - if(results.length>1) - results = results.slice(0,1); + if(results.length > 1) + results = results.slice(0, 1); } return results; -}; // statementsMatching - -/** remove a particular statement from the bank **/ -$rdf.IndexedFormula.prototype.remove = function (st) { + }; // statementsMatching + /** remove a particular statement from the bank **/ + $rdf.IndexedFormula.prototype.remove = function (st) { //$rdf.log.debug("entering remove w/ st=" + st); - var term = [ st.subject, st.predicate, st.object, st.why]; - for (var p=0; p<4; p++) { - var c = this.canon(term[p]); - var h = c.hashString(); - if (this.index[p][h] == undefined) { - //$rdf.log.warn ("Statement removal: no index '+p+': "+st); - } else { - $rdf.Util.RDFArrayRemove(this.index[p][h], st); - } + var term = [st.subject, st.predicate, st.object, st.why]; + for(var p = 0; p < 4; p++) { + var c = this.canon(term[p]); + var h = c.hashString(); + if(this.index[p][h] == undefined) { + //$rdf.log.warn ("Statement removal: no index '+p+': "+st); + } else { + $rdf.Util.RDFArrayRemove(this.index[p][h], st); + } } $rdf.Util.RDFArrayRemove(this.statements, st); -}; //remove - -/** remove all statements matching args (within limit) **/ -$rdf.IndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit) { + }; //remove + /** remove all statements matching args (within limit) **/ + $rdf.IndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit) { //$rdf.log.debug("entering removeMany w/ subj,pred,obj,why,limit = " + subj +", "+ pred+", " + obj+", " + why+", " + limit); - var sts = this.statementsMatching (subj, pred, obj, why, false); + var sts = this.statementsMatching(subj, pred, obj, why, false); //This is a subtle bug that occcured in updateCenter.js too. //The fact is, this.statementsMatching returns this.whyIndex instead of a copy of it //but for perfromance consideration, it's better to just do that //so make a copy here. var statements = []; - for (var i=0;i<sts.length;i++) statements.push(sts[i]); - if (limit) statements = statements.slice(0, limit); - for (var i=0;i<statements.length;i++) this.remove(statements[i]); -}; //removeMany - -/** Utility**/ + for(var i = 0; i < sts.length; i++) statements.push(sts[i]); + if(limit) statements = statements.slice(0, limit); + for(var i = 0; i < statements.length; i++) this.remove(statements[i]); + }; //removeMany + /** Utility**/ -/* @method: copyTo + /* @method: copyTo @description: replace @template with @target and add appropriate triples (no triple removed) one-direction replication -*/ -$rdf.IndexedFormula.prototype.copyTo = function(template,target,flags){ - if (!flags) flags=[]; - var statList=this.statementsMatching(template); - if ($rdf.Util.ArrayIndexOf(flags,'two-direction')!=-1) - statList.concat(this.statementsMatching(undefined,undefined,template)); - for (var i=0;i<statList.length;i++){ - var st=statList[i]; - switch (st.object.termType){ - case 'symbol': - this.add(target,st.predicate,st.object); - break; - case 'literal': - case 'bnode': - case 'collection': - this.add(target,st.predicate,st.object.copy(this)); - } - if ($rdf.Util.ArrayIndexOf(flags,'delete')!=-1) this.remove(st); +*/ + $rdf.IndexedFormula.prototype.copyTo = function (template, target, flags) { + if(!flags) flags = []; + var statList = this.statementsMatching(template); + if($rdf.Util.ArrayIndexOf(flags, 'two-direction') != -1) + statList.concat(this.statementsMatching(undefined, undefined, template)); + for(var i = 0; i < statList.length; i++) { + var st = statList[i]; + switch(st.object.termType) { + case 'symbol': + this.add(target, st.predicate, st.object); + break; + case 'literal': + case 'bnode': + case 'collection': + this.add(target, st.predicate, st.object.copy(this)); + } + if($rdf.Util.ArrayIndexOf(flags, 'delete') != -1) this.remove(st); } -}; -//for the case when you alter this.value (text modified in userinput.js) -$rdf.Literal.prototype.copy = function(){ - return new $rdf.Literal(this.value,this.lang,this.datatype); -}; -$rdf.BlankNode.prototype.copy = function(formula){ //depends on the formula - var bnodeNew=new $rdf.BlankNode(); - formula.copyTo(this,bnodeNew); + }; + //for the case when you alter this.value (text modified in userinput.js) + $rdf.Literal.prototype.copy = function () { + return new $rdf.Literal(this.value, this.lang, this.datatype); + }; + $rdf.BlankNode.prototype.copy = function (formula) { //depends on the formula + var bnodeNew = new $rdf.BlankNode(); + formula.copyTo(this, bnodeNew); return bnodeNew; -} -/** Full N3 bits -- placeholders only to allow parsing, no functionality! **/ + } + /** Full N3 bits -- placeholders only to allow parsing, no functionality! **/ -$rdf.IndexedFormula.prototype.newUniversal = function(uri) { + $rdf.IndexedFormula.prototype.newUniversal = function (uri) { var x = this.sym(uri); - if (!this._universalVariables) this._universalVariables = []; + if(!this._universalVariables) this._universalVariables = []; this._universalVariables.push(x); return x; -} + } -$rdf.IndexedFormula.prototype.newExistential = function(uri) { - if (!uri) return this.bnode(); + $rdf.IndexedFormula.prototype.newExistential = function (uri) { + if(!uri) return this.bnode(); var x = this.sym(uri); return this.declareExistential(x); -} + } -$rdf.IndexedFormula.prototype.declareExistential = function(x) { - if (!this._existentialVariables) this._existentialVariables = []; + $rdf.IndexedFormula.prototype.declareExistential = function (x) { + if(!this._existentialVariables) this._existentialVariables = []; this._existentialVariables.push(x); return x; -} + } -$rdf.IndexedFormula.prototype.formula = function(features) { + $rdf.IndexedFormula.prototype.formula = function (features) { return new $rdf.IndexedFormula(features); -} + } -$rdf.IndexedFormula.prototype.close = function() { + $rdf.IndexedFormula.prototype.close = function () { return this; -} + } -$rdf.IndexedFormula.prototype.hashString = $rdf.IndexedFormula.prototype.toNT; + $rdf.IndexedFormula.prototype.hashString = $rdf.IndexedFormula.prototype.toNT; -return $rdf.IndexedFormula; + return $rdf.IndexedFormula; }(); -// ends +// ends +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/init.js b/chrome/content/zotero/xpcom/rdf/init.js @@ -1,32 +1,32 @@ /* Set up the environment before loading the rest of the files into Zotero */ var $rdf = { - Util: { - ArrayIndexOf: function (arr, item, i) { - //supported in all browsers except IE<9 - return arr.indexOf(item, i); - }, - RDFArrayRemove: function(a, x) { //removes all statements equal to x from a - for(var i=0; i<a.length; i++) { - //TODO: This used to be the following, which didnt always work..why - //if(a[i] == x) - if (a[i].subject.sameTerm( x.subject ) && - a[i].predicate.sameTerm( x.predicate ) && - a[i].object.sameTerm( x.object ) && - a[i].why.sameTerm( x.why )) { - a.splice(i,1); - return; - } - } - throw "RDFArrayRemove: Array did not contain " + x; - }, - }, + Util: { + ArrayIndexOf: function (arr, item, i) { + //supported in all browsers except IE<9 + return arr.indexOf(item, i); + }, + RDFArrayRemove: function (a, x) { //removes all statements equal to x from a + for(var i = 0; i < a.length; i++) { + //TODO: This used to be the following, which didnt always work..why + //if(a[i] == x) + if(a[i].subject.sameTerm(x.subject) + && a[i].predicate.sameTerm(x.predicate) + && a[i].object.sameTerm(x.object) + && a[i].why.sameTerm(x.why)) { + a.splice(i, 1); + return; + } + } + throw "RDFArrayRemove: Array did not contain " + x; + }, + }, }; var tabulator = { - log: { - debug: Zotero.debug, - warn: Zotero.debug - } + log: { + debug: Zotero.debug, + warn: Zotero.debug + } }; var alert = tabulator.log.warn; \ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/match.js b/chrome/content/zotero/xpcom/rdf/match.js @@ -5,36 +5,42 @@ // // We retpresent a set as an associative array whose value for // each member is set to true. - - -$rdf.Symbol.prototype.sameTerm = function(other) { - if (!other) { return false } - return ((this.termType == other.termType) && (this.uri == other.uri)) +$rdf.Symbol.prototype.sameTerm = function (other) { + if(!other) { + return false + } + return((this.termType == other.termType) && (this.uri == other.uri)) } -$rdf.BlankNode.prototype.sameTerm = function(other) { - if (!other) { return false } - return ((this.termType == other.termType) && (this.id == other.id)) +$rdf.BlankNode.prototype.sameTerm = function (other) { + if(!other) { + return false + } + return((this.termType == other.termType) && (this.id == other.id)) } -$rdf.Literal.prototype.sameTerm = function(other) { - if (!other) { return false } - return ((this.termType == other.termType) - && (this.value == other.value) - && (this.lang == other.lang) && - ((!this.datatype && !other.datatype) - || (this.datatype && this.datatype.sameTerm(other.datatype)))) +$rdf.Literal.prototype.sameTerm = function (other) { + if(!other) { + return false + } + return((this.termType == other.termType) + && (this.value == other.value) + && (this.lang == other.lang) + && ((!this.datatype && !other.datatype) + || (this.datatype && this.datatype.sameTerm(other.datatype)))) } $rdf.Variable.prototype.sameTerm = function (other) { - if (!other) { return false } - return((this.termType == other.termType) && (this.uri == other.uri)) + if(!other) { + return false + } + return((this.termType == other.termType) && (this.uri == other.uri)) } $rdf.Collection.prototype.sameTerm = $rdf.BlankNode.prototype.sameTerm $rdf.Formula.prototype.sameTerm = function (other) { - return this.hashString() == other.hashString(); + return this.hashString() == other.hashString(); } // Comparison for ordering // @@ -44,7 +50,6 @@ $rdf.Formula.prototype.sameTerm = function (other) { // When we smush nodes we take the lowest value. This is not // arbitrary: we want the value actually used to be the literal // (or list or formula). - $rdf.Literal.prototype.classOrder = 1 $rdf.Collection.prototype.classOrder = 3 $rdf.Formula.prototype.classOrder = 4 @@ -53,77 +58,87 @@ $rdf.BlankNode.prototype.classOrder = 6 // Compaisons return sign(self - other) // Literals must come out before terms for smushing +$rdf.Literal.prototype.compareTerm = function (other) { + if(this.classOrder < other.classOrder) return -1 + if(this.classOrder > other.classOrder) return +1 + if(this.value < other.value) return -1 + if(this.value > other.value) return +1 + return 0 +} -$rdf.Literal.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.value < other.value) return -1 - if (this.value > other.value) return +1 - return 0 -} - -$rdf.Symbol.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.uri < other.uri) return -1 - if (this.uri > other.uri) return +1 - return 0 -} - -$rdf.BlankNode.prototype.compareTerm = function(other) { - if (this.classOrder < other.classOrder) return -1 - if (this.classOrder > other.classOrder) return +1 - if (this.id < other.id) return -1 - if (this.id > other.id) return +1 - return 0 -} +$rdf.Symbol.prototype.compareTerm = function (other) { + if(this.classOrder < other.classOrder) return -1 + if(this.classOrder > other.classOrder) return +1 + if(this.uri < other.uri) return -1 + if(this.uri > other.uri) return +1 + return 0 +} + +$rdf.BlankNode.prototype.compareTerm = function (other) { + if(this.classOrder < other.classOrder) return -1 + if(this.classOrder > other.classOrder) return +1 + if(this.id < other.id) return -1 + if(this.id > other.id) return +1 + return 0 +} $rdf.Collection.prototype.compareTerm = $rdf.BlankNode.prototype.compareTerm // Convenience routines - // Only one of s p o can be undefined, and w is optional. -$rdf.Formula.prototype.each = function(s,p,o,w) { - var results = [] - var st, sts = this.statementsMatching(s,p,o,w,false) - var i, n=sts.length - if (typeof s == 'undefined') { - for (i=0; i<n; i++) {st=sts[i]; results.push(st.subject)} - } else if (typeof p == 'undefined') { - for (i=0; i<n; i++) {st=sts[i]; results.push(st.predicate)} - } else if (typeof o == 'undefined') { - for (i=0; i<n; i++) {st=sts[i]; results.push(st.object)} - } else if (typeof w == 'undefined') { - for (i=0; i<n; i++) {st=sts[i]; results.push(st.why)} +$rdf.Formula.prototype.each = function (s, p, o, w) { + var results = [] + var st, sts = this.statementsMatching(s, p, o, w, false) + var i, n = sts.length + if(typeof s == 'undefined') { + for(i = 0; i < n; i++) { + st = sts[i]; + results.push(st.subject) + } + } else if(typeof p == 'undefined') { + for(i = 0; i < n; i++) { + st = sts[i]; + results.push(st.predicate) + } + } else if(typeof o == 'undefined') { + for(i = 0; i < n; i++) { + st = sts[i]; + results.push(st.object) } - return results + } else if(typeof w == 'undefined') { + for(i = 0; i < n; i++) { + st = sts[i]; + results.push(st.why) + } + } + return results } -$rdf.Formula.prototype.any = function(s,p,o,w) { - var st = this.anyStatementMatching(s,p,o,w) - if (typeof st == 'undefined') return undefined; - - if (typeof s == 'undefined') return st.subject; - if (typeof p == 'undefined') return st.predicate; - if (typeof o == 'undefined') return st.object; +$rdf.Formula.prototype.any = function (s, p, o, w) { + var st = this.anyStatementMatching(s, p, o, w) + if(typeof st == 'undefined') return undefined; - return undefined -} + if(typeof s == 'undefined') return st.subject; + if(typeof p == 'undefined') return st.predicate; + if(typeof o == 'undefined') return st.object; -$rdf.Formula.prototype.holds = function(s,p,o,w) { - var st = this.anyStatementMatching(s,p,o,w) - if (typeof st == 'undefined') return false; - return true; + return undefined } -$rdf.Formula.prototype.the = function(s,p,o,w) { - // the() should contain a check there is only one - var x = this.any(s,p,o,w) - if (typeof x == 'undefined') - $rdf.log.error("No value found for the(){" + s + " " + p + " " + o + "}.") - return x +$rdf.Formula.prototype.holds = function (s, p, o, w) { + var st = this.anyStatementMatching(s, p, o, w) + if(typeof st == 'undefined') return false; + return true; } -$rdf.Formula.prototype.whether = function(s,p,o,w) { - return this.statementsMatching(s,p,o,w,false).length; +$rdf.Formula.prototype.the = function (s, p, o, w) { + // the() should contain a check there is only one + var x = this.any(s, p, o, w) + if(typeof x == 'undefined') + $rdf.log.error("No value found for the(){" + s + " " + p + " " + o + "}.") + return x } + +$rdf.Formula.prototype.whether = function (s, p, o, w) { + return this.statementsMatching(s, p, o, w, false).length; +} +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/n3parser.js b/chrome/content/zotero/xpcom/rdf/n3parser.js @@ -1,93 +1,98 @@ $rdf.N3Parser = function () { -function hexify(str) { // also used in parser - return encodeURI(str); -} - -// Things we need to define to make converted pythn code work in js -// environment of $rdf - -var RDFSink_forSomeSym = "http://www.w3.org/2000/10/swap/log#forSome"; -var RDFSink_forAllSym = "http://www.w3.org/2000/10/swap/log#forAll"; -var Logic_NS = "http://www.w3.org/2000/10/swap/log#"; + function hexify(str) { // also used in parser + return encodeURI(str); + } -// pyjs seems to reference runtime library which I didn't find + // Things we need to define to make converted pythn code work in js + // environment of $rdf + var RDFSink_forSomeSym = "http://www.w3.org/2000/10/swap/log#forSome"; + var RDFSink_forAllSym = "http://www.w3.org/2000/10/swap/log#forAll"; + var Logic_NS = "http://www.w3.org/2000/10/swap/log#"; -var pyjslib_Tuple = function(theList) { return theList }; + // pyjs seems to reference runtime library which I didn't find + var pyjslib_Tuple = function (theList) { + return theList + }; -var pyjslib_List = function(theList) { return theList }; + var pyjslib_List = function (theList) { + return theList + }; -var pyjslib_Dict = function(listOfPairs) { - if (listOfPairs.length > 0) - throw "missing.js: oops nnonempty dict not imp"; - return []; -} - -var pyjslib_len = function(s) { return s.length } + var pyjslib_Dict = function (listOfPairs) { + if(listOfPairs.length > 0) + throw "missing.js: oops nnonempty dict not imp"; + return []; + } -var pyjslib_slice = function(str, i, j) { - if (typeof str.slice == 'undefined') - throw '@@ mising.js: No .slice function for '+str+' of type '+(typeof str) - if ((typeof j == 'undefined') || (j ==null)) return str.slice(i); - return str.slice(i, j) // @ exactly the same spec? -} -var StopIteration = Error('dummy error stop iteration'); + var pyjslib_len = function (s) { + return s.length + } -var pyjslib_Iterator = function(theList) { - this.last = 0; - this.li = theList; - this.next = function() { - if (this.last == this.li.length) throw StopIteration; - return this.li[this.last++]; + var pyjslib_slice = function (str, i, j) { + if(typeof str.slice == 'undefined') + throw '@@ mising.js: No .slice function for ' + str + ' of type ' + (typeof str) + if((typeof j == 'undefined') || (j == null)) return str.slice(i); + return str.slice(i, j) // @ exactly the same spec? } - return this; -}; + var StopIteration = Error('dummy error stop iteration'); -var ord = function(str) { - return str.charCodeAt(0) -} + var pyjslib_Iterator = function (theList) { + this.last = 0; + this.li = theList; + this.next = function () { + if(this.last == this.li.length) throw StopIteration; + return this.li[this.last++]; + } + return this; + }; -var string_find = function(str, s) { - return str.indexOf(s) -} + var ord = function (str) { + return str.charCodeAt(0) + } -var assertFudge = function(condition, desc) { - if (condition) return; - if (desc) throw "python Assertion failed: "+desc; - throw "(python) Assertion failed."; -} + var string_find = function (str, s) { + return str.indexOf(s) + } + var assertFudge = function (condition, desc) { + if(condition) return; + if(desc) throw "python Assertion failed: " + desc; + throw "(python) Assertion failed."; + } -var stringFromCharCode = function(uesc) { - return String.fromCharCode(uesc); -} -var uripath_join = function(base, given) { - return $rdf.Util.uri.join(given, base) // sad but true -} + var stringFromCharCode = function (uesc) { + return String.fromCharCode(uesc); + } -var becauseSubexpression = null; // No reason needed -var diag_tracking = 0; -var diag_chatty_flag = 0; -var diag_progress = function(str) { /*$rdf.log.debug(str);*/ } + var uripath_join = function (base, given) { + return $rdf.Util.uri.join(given, base) // sad but true + } -// why_BecauseOfData = function(doc, reason) { return doc }; + var becauseSubexpression = null; // No reason needed + var diag_tracking = 0; + var diag_chatty_flag = 0; + var diag_progress = function (str) { + /*$rdf.log.debug(str);*/ + } + // why_BecauseOfData = function(doc, reason) { return doc }; -var RDF_type_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; -var DAML_sameAs_URI = "http://www.w3.org/2002/07/owl#sameAs"; + var RDF_type_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; + var DAML_sameAs_URI = "http://www.w3.org/2002/07/owl#sameAs"; -/* + /* function SyntaxError(details) { return new __SyntaxError(details); } */ -function __SyntaxError(details) { + function __SyntaxError(details) { this.details = details -} + } -/* + /* $Id: n3parser.js 14561 2008-02-23 06:37:26Z kennyluck $ @@ -117,49 +122,51 @@ the module, including tests and test harness. */ -var ADDED_HASH = "#"; -var LOG_implies_URI = "http://www.w3.org/2000/10/swap/log#implies"; -var INTEGER_DATATYPE = "http://www.w3.org/2001/XMLSchema#integer"; -var FLOAT_DATATYPE = "http://www.w3.org/2001/XMLSchema#double"; -var DECIMAL_DATATYPE = "http://www.w3.org/2001/XMLSchema#decimal"; -var BOOLEAN_DATATYPE = "http://www.w3.org/2001/XMLSchema#boolean"; -var option_noregen = 0; -var _notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~"; -var _notNameChars = ( _notQNameChars + ":" ) ; -var _rdfns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; -var N3CommentCharacter = "#"; -var eol = new RegExp("^[ \\t]*(#[^\\n]*)?\\r?\\n", 'g'); -var eof = new RegExp("^[ \\t]*(#[^\\n]*)?$", 'g'); -var ws = new RegExp("^[ \\t]*", 'g'); -var signed_integer = new RegExp("^[-+]?[0-9]+", 'g'); -var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?(e[-+]?[0-9]+)?", 'g'); -var digitstring = new RegExp("^[0-9]+", 'g'); -var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g'); -var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)?", 'g'); -function SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { + var ADDED_HASH = "#"; + var LOG_implies_URI = "http://www.w3.org/2000/10/swap/log#implies"; + var INTEGER_DATATYPE = "http://www.w3.org/2001/XMLSchema#integer"; + var FLOAT_DATATYPE = "http://www.w3.org/2001/XMLSchema#double"; + var DECIMAL_DATATYPE = "http://www.w3.org/2001/XMLSchema#decimal"; + var BOOLEAN_DATATYPE = "http://www.w3.org/2001/XMLSchema#boolean"; + var option_noregen = 0; + var _notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~"; + var _notNameChars = (_notQNameChars + ":"); + var _rdfns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + var N3CommentCharacter = "#"; + var eol = new RegExp("^[ \\t]*(#[^\\n]*)?\\r?\\n", 'g'); + var eof = new RegExp("^[ \\t]*(#[^\\n]*)?$", 'g'); + var ws = new RegExp("^[ \\t]*", 'g'); + var signed_integer = new RegExp("^[-+]?[0-9]+", 'g'); + var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?(e[-+]?[0-9]+)?", 'g'); + var digitstring = new RegExp("^[0-9]+", 'g'); + var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g'); + var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)?", 'g'); + + function SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { return new __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why); -} -function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { - if (typeof openFormula == 'undefined') openFormula=null; - if (typeof thisDoc == 'undefined') thisDoc=""; - if (typeof baseURI == 'undefined') baseURI=null; - if (typeof genPrefix == 'undefined') genPrefix=""; - if (typeof metaURI == 'undefined') metaURI=null; - if (typeof flags == 'undefined') flags=""; - if (typeof why == 'undefined') why=null; + } + + function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) { + if(typeof openFormula == 'undefined') openFormula = null; + if(typeof thisDoc == 'undefined') thisDoc = ""; + if(typeof baseURI == 'undefined') baseURI = null; + if(typeof genPrefix == 'undefined') genPrefix = ""; + if(typeof metaURI == 'undefined') metaURI = null; + if(typeof flags == 'undefined') flags = ""; + if(typeof why == 'undefined') why = null; /* note: namespace names should *not* end in #; the # will get added during qname processing */ - + this._bindings = new pyjslib_Dict([]); this._flags = flags; - if ((thisDoc != "")) { - assertFudge((thisDoc.indexOf(":") >= 0), ( "Document URI not absolute: " + thisDoc ) ); - this._bindings[""] = ( ( thisDoc + "#" ) ); + if((thisDoc != "")) { + assertFudge((thisDoc.indexOf(":") >= 0), ("Document URI not absolute: " + thisDoc)); + this._bindings[""] = ((thisDoc + "#")); } this._store = store; - if (genPrefix) { - store.setGenPrefix(genPrefix); + if(genPrefix) { + store.setGenPrefix(genPrefix); } this._thisDoc = thisDoc; this.source = store.sym(thisDoc); @@ -175,61 +182,56 @@ function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, this._parentVariables = new pyjslib_Dict([]); this._reason = why; this._reason2 = null; - if (diag_tracking) { - this._reason2 = why_BecauseOfData(store.sym(thisDoc), this._reason); - } - if (baseURI) { - this._baseURI = baseURI; - } - else { - if (thisDoc) { - this._baseURI = thisDoc; - } - else { - this._baseURI = null; - } + if(diag_tracking) { + this._reason2 = why_BecauseOfData(store.sym(thisDoc), this._reason); + } + if(baseURI) { + this._baseURI = baseURI; + } else { + if(thisDoc) { + this._baseURI = thisDoc; + } else { + this._baseURI = null; + } } assertFudge(!(this._baseURI) || (this._baseURI.indexOf(":") >= 0)); - if (!(this._genPrefix)) { - if (this._thisDoc) { - this._genPrefix = ( this._thisDoc + "#_g" ) ; - } - else { - this._genPrefix = RDFSink_uniqueURI(); - } - } - if ((openFormula == null)) { - if (this._thisDoc) { - this._formula = store.formula( ( thisDoc + "#_formula" ) ); - } - else { - this._formula = store.formula(); - } - } - else { - this._formula = openFormula; + if(!(this._genPrefix)) { + if(this._thisDoc) { + this._genPrefix = (this._thisDoc + "#_g"); + } else { + this._genPrefix = RDFSink_uniqueURI(); + } + } + if((openFormula == null)) { + if(this._thisDoc) { + this._formula = store.formula((thisDoc + "#_formula")); + } else { + this._formula = store.formula(); + } + } else { + this._formula = openFormula; } this._context = this._formula; this._parentContext = null; -} -__SinkParser.prototype.here = function(i) { - return ( ( ( ( this._genPrefix + "_L" ) + this.lines ) + "C" ) + ( ( i - this.startOfLine ) + 1 ) ) ; -}; -__SinkParser.prototype.formula = function() { + } + __SinkParser.prototype.here = function (i) { + return((((this._genPrefix + "_L") + this.lines) + "C") + ((i - this.startOfLine) + 1)); + }; + __SinkParser.prototype.formula = function () { return this._formula; -}; -__SinkParser.prototype.loadStream = function(stream) { + }; + __SinkParser.prototype.loadStream = function (stream) { return this.loadBuf(stream.read()); -}; -__SinkParser.prototype.loadBuf = function(buf) { + }; + __SinkParser.prototype.loadBuf = function (buf) { /* Parses a buffer and returns its top level formula*/ - + this.startDoc(); this.feed(buf); return this.endDoc(); -}; -__SinkParser.prototype.feed = function(octets) { + }; + __SinkParser.prototype.feed = function (octets) { /* Feed an octet stream tothe parser @@ -238,219 +240,212 @@ __SinkParser.prototype.feed = function(octets) { remainder after any statements have been parsed. So if there is more data to feed to the parser, it should be straightforward to recover.*/ - + var str = octets; var i = 0; - while ((i >= 0)) { - var j = this.skipSpace(str, i); - if ((j < 0)) { - return; - } - var i = this.directiveOrStatement(str, j); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected directive or statement"); - } - } -}; -__SinkParser.prototype.directiveOrStatement = function(str, h) { + while((i >= 0)) { + var j = this.skipSpace(str, i); + if((j < 0)) { + return; + } + var i = this.directiveOrStatement(str, j); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "expected directive or statement"); + } + } + }; + __SinkParser.prototype.directiveOrStatement = function (str, h) { var i = this.skipSpace(str, h); - if ((i < 0)) { - return i; + if((i < 0)) { + return i; } var j = this.directive(str, i); - if ((j >= 0)) { - return this.checkDot(str, j); + if((j >= 0)) { + return this.checkDot(str, j); } var j = this.statement(str, i); - if ((j >= 0)) { - return this.checkDot(str, j); + if((j >= 0)) { + return this.checkDot(str, j); } return j; -}; -__SinkParser.prototype.tok = function(tok, str, i) { + }; + __SinkParser.prototype.tok = function (tok, str, i) { /* Check for keyword. Space must have been stripped on entry and we must not be at end of file.*/ var whitespace = "\t\n\v\f\r "; - if ((pyjslib_slice(str, i, ( i + 1 ) ) == "@")) { - var i = ( i + 1 ) ; - } - else { - if (($rdf.Util.ArrayIndexOf(this.keywords,tok) < 0)) { - return -1; - } - } - var k = ( i + pyjslib_len(tok) ) ; - if ((pyjslib_slice(str, i, k) == tok) && (_notQNameChars.indexOf(str.charAt(k)) >= 0)) { - return k; - } - else { + if((pyjslib_slice(str, i, (i + 1)) == "@")) { + var i = (i + 1); + } else { + if(($rdf.Util.ArrayIndexOf(this.keywords, tok) < 0)) { return -1; + } + } + var k = (i + pyjslib_len(tok)); + if((pyjslib_slice(str, i, k) == tok) && (_notQNameChars.indexOf(str.charAt(k)) >= 0)) { + return k; + } else { + return -1; } -}; -__SinkParser.prototype.directive = function(str, i) { + }; + __SinkParser.prototype.directive = function (str, i) { var j = this.skipSpace(str, i); - if ((j < 0)) { - return j; + if((j < 0)) { + return j; } var res = new pyjslib_List([]); var j = this.tok("bind", str, i); - if ((j > 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "keyword bind is obsolete: use @prefix"); + if((j > 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "keyword bind is obsolete: use @prefix"); } var j = this.tok("keywords", str, i); - if ((j > 0)) { - var i = this.commaSeparatedList(str, j, res, false); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "'@keywords' needs comma separated list of words"); - } - this.setKeywords(pyjslib_slice(res, null, null)); - if ((diag_chatty_flag > 80)) { - diag_progress("Keywords ", this.keywords); - } - return i; + if((j > 0)) { + var i = this.commaSeparatedList(str, j, res, false); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "'@keywords' needs comma separated list of words"); + } + this.setKeywords(pyjslib_slice(res, null, null)); + if((diag_chatty_flag > 80)) { + diag_progress("Keywords ", this.keywords); + } + return i; } var j = this.tok("forAll", str, i); - if ((j > 0)) { - var i = this.commaSeparatedList(str, j, res, true); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forAll"); + if((j > 0)) { + var i = this.commaSeparatedList(str, j, res, true); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forAll"); + } + + var __x = new pyjslib_Iterator(res); + try { + while(true) { + var x = __x.next(); + + + if($rdf.Util.ArrayIndexOf(this._variables, x) < 0 || ($rdf.Util.ArrayIndexOf(this._parentVariables, x) >= 0)) { + this._variables[x] = (this._context.newUniversal(x)); + } + } - - var __x = new pyjslib_Iterator(res); - try { - while (true) { - var x = __x.next(); - - - if ($rdf.Util.ArrayIndexOf(this._variables,x) < 0 || ($rdf.Util.ArrayIndexOf(this._parentVariables,x) >= 0)) { - this._variables[x] = ( this._context.newUniversal(x)); - } - - } - } catch (e) { - if (e != StopIteration) { - throw e; - } + } catch(e) { + if(e != StopIteration) { + throw e; } - - return i; + } + + return i; } var j = this.tok("forSome", str, i); - if ((j > 0)) { - var i = this.commaSeparatedList(str, j, res, this.uri_ref2); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forSome"); + if((j > 0)) { + var i = this.commaSeparatedList(str, j, res, this.uri_ref2); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad variable list after @forSome"); + } + + var __x = new pyjslib_Iterator(res); + try { + while(true) { + var x = __x.next(); + + + this._context.declareExistential(x); + } - - var __x = new pyjslib_Iterator(res); - try { - while (true) { - var x = __x.next(); - - - this._context.declareExistential(x); - - } - } catch (e) { - if (e != StopIteration) { - throw e; - } + } catch(e) { + if(e != StopIteration) { + throw e; } - - return i; + } + + return i; } var j = this.tok("prefix", str, i); - if ((j >= 0)) { - var t = new pyjslib_List([]); - var i = this.qname(str, j, t); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected qname after @prefix"); - } - var j = this.uri_ref2(str, i, t); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected <uriref> after @prefix _qname_"); - } - var ns = t[1].uri; - if (this._baseURI) { - var ns = uripath_join(this._baseURI, ns); - } - else { - assertFudge((ns.indexOf(":") >= 0), "With no base URI, cannot handle relative URI for NS"); - } - assertFudge((ns.indexOf(":") >= 0)); - this._bindings[t[0][0]] = ( ns); - - this.bind(t[0][0], hexify(ns)); - return j; + if((j >= 0)) { + var t = new pyjslib_List([]); + var i = this.qname(str, j, t); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "expected qname after @prefix"); + } + var j = this.uri_ref2(str, i, t); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected <uriref> after @prefix _qname_"); + } + var ns = t[1].uri; + if(this._baseURI) { + var ns = uripath_join(this._baseURI, ns); + } else { + assertFudge((ns.indexOf(":") >= 0), "With no base URI, cannot handle relative URI for NS"); + } + assertFudge((ns.indexOf(":") >= 0)); + this._bindings[t[0][0]] = (ns); + + this.bind(t[0][0], hexify(ns)); + return j; } var j = this.tok("base", str, i); - if ((j >= 0)) { - var t = new pyjslib_List([]); - var i = this.uri_ref2(str, j, t); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected <uri> after @base "); - } - var ns = t[0].uri; - if (this._baseURI) { - var ns = uripath_join(this._baseURI, ns); - } - else { - throw BadSyntax(this._thisDoc, this.lines, str, j, ( ( "With no previous base URI, cannot use relative URI in @base <" + ns ) + ">" ) ); - } - assertFudge((ns.indexOf(":") >= 0)); - this._baseURI = ns; - return i; + if((j >= 0)) { + var t = new pyjslib_List([]); + var i = this.uri_ref2(str, j, t); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "expected <uri> after @base "); + } + var ns = t[0].uri; + if(this._baseURI) { + var ns = uripath_join(this._baseURI, ns); + } else { + throw BadSyntax(this._thisDoc, this.lines, str, j, (("With no previous base URI, cannot use relative URI in @base <" + ns) + ">")); + } + assertFudge((ns.indexOf(":") >= 0)); + this._baseURI = ns; + return i; } return -1; -}; -__SinkParser.prototype.bind = function(qn, uri) { - if ((qn == "")) { - } - else { - this._store.setPrefixForURI(qn, uri); - } -}; -__SinkParser.prototype.setKeywords = function(k) { + }; + __SinkParser.prototype.bind = function (qn, uri) { + if((qn == "")) { + } else { + this._store.setPrefixForURI(qn, uri); + } + }; + __SinkParser.prototype.setKeywords = function (k) { /* Takes a list of strings*/ - - if ((k == null)) { - this.keywordsSet = 0; - } - else { - this.keywords = k; - this.keywordsSet = 1; - } -}; -__SinkParser.prototype.startDoc = function() { -}; -__SinkParser.prototype.endDoc = function() { + + if((k == null)) { + this.keywordsSet = 0; + } else { + this.keywords = k; + this.keywordsSet = 1; + } + }; + __SinkParser.prototype.startDoc = function () {}; + __SinkParser.prototype.endDoc = function () { /* Signal end of document and stop parsing. returns formula*/ - + return this._formula; -}; -__SinkParser.prototype.makeStatement = function(quad) { + }; + __SinkParser.prototype.makeStatement = function (quad) { quad[0].add(quad[2], quad[1], quad[3], this.source); this.statementCount += 1; -}; -__SinkParser.prototype.statement = function(str, i) { + }; + __SinkParser.prototype.statement = function (str, i) { var r = new pyjslib_List([]); var i = this.object(str, i, r); - if ((i < 0)) { - return i; + if((i < 0)) { + return i; } var j = this.property_list(str, i, r[0]); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected propertylist"); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected propertylist"); } return j; -}; -__SinkParser.prototype.subject = function(str, i, res) { + }; + __SinkParser.prototype.subject = function (str, i, res) { return this.item(str, i, res); -}; -__SinkParser.prototype.verb = function(str, i, res) { + }; + __SinkParser.prototype.verb = function (str, i, res) { /* has _prop_ is _prop_ of @@ -460,398 +455,392 @@ __SinkParser.prototype.verb = function(str, i, res) { >- prop -> <- prop -< _operator_*/ - + var j = this.skipSpace(str, i); - if ((j < 0)) { - return j; + if((j < 0)) { + return j; } var r = new pyjslib_List([]); var j = this.tok("has", str, i); - if ((j >= 0)) { - var i = this.prop(str, j, r); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected property after 'has'"); - } - res.push(new pyjslib_Tuple(["->", r[0]])); - return i; + if((j >= 0)) { + var i = this.prop(str, j, r); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "expected property after 'has'"); + } + res.push(new pyjslib_Tuple(["->", r[0]])); + return i; } var j = this.tok("is", str, i); - if ((j >= 0)) { - var i = this.prop(str, j, r); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "expected <property> after 'is'"); - } - var j = this.skipSpace(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "End of file found, expected property after 'is'"); - return j; - } - var i = j; - var j = this.tok("of", str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected 'of' after 'is' <prop>"); - } - res.push(new pyjslib_Tuple(["<-", r[0]])); + if((j >= 0)) { + var i = this.prop(str, j, r); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "expected <property> after 'is'"); + } + var j = this.skipSpace(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "End of file found, expected property after 'is'"); return j; + } + var i = j; + var j = this.tok("of", str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected 'of' after 'is' <prop>"); + } + res.push(new pyjslib_Tuple(["<-", r[0]])); + return j; } var j = this.tok("a", str, i); - if ((j >= 0)) { - res.push(new pyjslib_Tuple(["->", this._store.sym(RDF_type_URI)])); - return j; - } - if ((pyjslib_slice(str, i, ( i + 2 ) ) == "<=")) { - res.push(new pyjslib_Tuple(["<-", this._store.sym( ( Logic_NS + "implies" ) )])); - return ( i + 2 ) ; - } - if ((pyjslib_slice(str, i, ( i + 1 ) ) == "=")) { - if ((pyjslib_slice(str, ( i + 1 ) , ( i + 2 ) ) == ">")) { - res.push(new pyjslib_Tuple(["->", this._store.sym( ( Logic_NS + "implies" ) )])); - return ( i + 2 ) ; - } - res.push(new pyjslib_Tuple(["->", this._store.sym(DAML_sameAs_URI)])); - return ( i + 1 ) ; - } - if ((pyjslib_slice(str, i, ( i + 2 ) ) == ":=")) { - res.push(new pyjslib_Tuple(["->", ( Logic_NS + "becomes" ) ])); - return ( i + 2 ) ; + if((j >= 0)) { + res.push(new pyjslib_Tuple(["->", this._store.sym(RDF_type_URI)])); + return j; + } + if((pyjslib_slice(str, i, (i + 2)) == "<=")) { + res.push(new pyjslib_Tuple(["<-", this._store.sym((Logic_NS + "implies"))])); + return(i + 2); + } + if((pyjslib_slice(str, i, (i + 1)) == "=")) { + if((pyjslib_slice(str, (i + 1), (i + 2)) == ">")) { + res.push(new pyjslib_Tuple(["->", this._store.sym((Logic_NS + "implies"))])); + return(i + 2); + } + res.push(new pyjslib_Tuple(["->", this._store.sym(DAML_sameAs_URI)])); + return(i + 1); + } + if((pyjslib_slice(str, i, (i + 2)) == ":=")) { + res.push(new pyjslib_Tuple(["->", (Logic_NS + "becomes")])); + return(i + 2); } var j = this.prop(str, i, r); - if ((j >= 0)) { - res.push(new pyjslib_Tuple(["->", r[0]])); - return j; + if((j >= 0)) { + res.push(new pyjslib_Tuple(["->", r[0]])); + return j; } - if ((pyjslib_slice(str, i, ( i + 2 ) ) == ">-") || (pyjslib_slice(str, i, ( i + 2 ) ) == "<-")) { - throw BadSyntax(this._thisDoc, this.lines, str, j, ">- ... -> syntax is obsolete."); + if((pyjslib_slice(str, i, (i + 2)) == ">-") || (pyjslib_slice(str, i, (i + 2)) == "<-")) { + throw BadSyntax(this._thisDoc, this.lines, str, j, ">- ... -> syntax is obsolete."); } return -1; -}; -__SinkParser.prototype.prop = function(str, i, res) { + }; + __SinkParser.prototype.prop = function (str, i, res) { return this.item(str, i, res); -}; -__SinkParser.prototype.item = function(str, i, res) { + }; + __SinkParser.prototype.item = function (str, i, res) { return this.path(str, i, res); -}; -__SinkParser.prototype.blankNode = function(uri) { + }; + __SinkParser.prototype.blankNode = function (uri) { return this._context.bnode(uri, this._reason2); -}; -__SinkParser.prototype.path = function(str, i, res) { + }; + __SinkParser.prototype.path = function (str, i, res) { /* Parse the path production. */ - + var j = this.nodeOrLiteral(str, i, res); - if ((j < 0)) { - return j; - } - while (("!^.".indexOf(pyjslib_slice(str, j, ( j + 1 ) )) >= 0)) { - var ch = pyjslib_slice(str, j, ( j + 1 ) ); - if ((ch == ".")) { - var ahead = pyjslib_slice(str, ( j + 1 ) , ( j + 2 ) ); - if (!(ahead) || (_notNameChars.indexOf(ahead) >= 0) && (":?<[{(".indexOf(ahead) < 0)) { - break; - } - } - var subj = res.pop(); - var obj = this.blankNode(this.here(j)); - var j = this.node(str, ( j + 1 ) , res); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in middle of path syntax"); - } - var pred = res.pop(); - if ((ch == "^")) { - this.makeStatement(new pyjslib_Tuple([this._context, pred, obj, subj])); - } - else { - this.makeStatement(new pyjslib_Tuple([this._context, pred, subj, obj])); - } - res.push(obj); + if((j < 0)) { + return j; + } + while(("!^.".indexOf(pyjslib_slice(str, j, (j + 1))) >= 0)) { + var ch = pyjslib_slice(str, j, (j + 1)); + if((ch == ".")) { + var ahead = pyjslib_slice(str, (j + 1), (j + 2)); + if(!(ahead) || (_notNameChars.indexOf(ahead) >= 0) && (":?<[{(".indexOf(ahead) < 0)) { + break; + } + } + var subj = res.pop(); + var obj = this.blankNode(this.here(j)); + var j = this.node(str, (j + 1), res); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in middle of path syntax"); + } + var pred = res.pop(); + if((ch == "^")) { + this.makeStatement(new pyjslib_Tuple([this._context, pred, obj, subj])); + } else { + this.makeStatement(new pyjslib_Tuple([this._context, pred, subj, obj])); + } + res.push(obj); } return j; -}; -__SinkParser.prototype.anonymousNode = function(ln) { + }; + __SinkParser.prototype.anonymousNode = function (ln) { /* Remember or generate a term for one of these _: anonymous nodes*/ - + var term = this._anonymousNodes[ln]; - if (term) { - return term; + if(term) { + return term; } var term = this._store.bnode(this._context, this._reason2); - this._anonymousNodes[ln] = ( term); + this._anonymousNodes[ln] = (term); return term; -}; -__SinkParser.prototype.node = function(str, i, res, subjectAlready) { - if (typeof subjectAlready == 'undefined') subjectAlready=null; + }; + __SinkParser.prototype.node = function (str, i, res, subjectAlready) { + if(typeof subjectAlready == 'undefined') subjectAlready = null; /* Parse the <node> production. Space is now skipped once at the beginning instead of in multipe calls to self.skipSpace(). */ - + var subj = subjectAlready; var j = this.skipSpace(str, i); - if ((j < 0)) { - return j; + if((j < 0)) { + return j; } var i = j; - var ch = pyjslib_slice(str, i, ( i + 1 ) ); - if ((ch == "[")) { - var bnodeID = this.here(i); - var j = this.skipSpace(str, ( i + 1 ) ); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF after '['"); - } - if ((pyjslib_slice(str, j, ( j + 1 ) ) == "=")) { - var i = ( j + 1 ) ; - var objs = new pyjslib_List([]); - var j = this.objectList(str, i, objs); - - if ((j >= 0)) { - var subj = objs[0]; - if ((pyjslib_len(objs) > 1)) { - - var __obj = new pyjslib_Iterator(objs); - try { - while (true) { - var obj = __obj.next(); - - - this.makeStatement(new pyjslib_Tuple([this._context, this._store.sym(DAML_sameAs_URI), subj, obj])); - - } - } catch (e) { - if (e != StopIteration) { - throw e; - } - } - - } - var j = this.skipSpace(str, j); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when objectList expected after [ = "); - } - if ((pyjslib_slice(str, j, ( j + 1 ) ) == ";")) { - var j = ( j + 1 ) ; - } - } - else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "objectList expected after [= "); - } - } - if ((subj == null)) { - var subj = this.blankNode(bnodeID); - } - var i = this.property_list(str, j, subj); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "property_list expected"); - } - var j = this.skipSpace(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when ']' expected after [ <propertyList>"); - } - if ((pyjslib_slice(str, j, ( j + 1 ) ) != "]")) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "']' expected"); - } - res.push(subj); - return ( j + 1 ) ; - } - if ((ch == "{")) { - var ch2 = pyjslib_slice(str, ( i + 1 ) , ( i + 2 ) ); - if ((ch2 == "$")) { - i += 1; - var j = ( i + 1 ) ; - var mylist = new pyjslib_List([]); - var first_run = true; - while (1) { - var i = this.skipSpace(str, j); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '$}', found end."); - } - if ((pyjslib_slice(str, i, ( i + 2 ) ) == "$}")) { - var j = ( i + 2 ) ; - break; - } - if (!(first_run)) { - if ((pyjslib_slice(str, i, ( i + 1 ) ) == ",")) { - i += 1; - } - else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected: ','"); - } - } - else { - var first_run = false; - } - var item = new pyjslib_List([]); - var j = this.item(str, i, item); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in set or '$}'"); - } - mylist.push(item[0]); - } - res.push(this._store.newSet(mylist, this._context)); - return j; - } - else { - var j = ( i + 1 ) ; - var oldParentContext = this._parentContext; - this._parentContext = this._context; - var parentAnonymousNodes = this._anonymousNodes; - var grandParentVariables = this._parentVariables; - this._parentVariables = this._variables; - this._anonymousNodes = new pyjslib_Dict([]); - this._variables = this._variables.slice(); - var reason2 = this._reason2; - this._reason2 = becauseSubexpression; - if ((subj == null)) { - var subj = this._store.formula(); - } - this._context = subj; - while (1) { - var i = this.skipSpace(str, j); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '}', found end."); - } - if ((pyjslib_slice(str, i, ( i + 1 ) ) == "}")) { - var j = ( i + 1 ) ; - break; - } - var j = this.directiveOrStatement(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected statement or '}'"); - } + var ch = pyjslib_slice(str, i, (i + 1)); + if((ch == "[")) { + var bnodeID = this.here(i); + var j = this.skipSpace(str, (i + 1)); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF after '['"); + } + if((pyjslib_slice(str, j, (j + 1)) == "=")) { + var i = (j + 1); + var objs = new pyjslib_List([]); + var j = this.objectList(str, i, objs); + + if((j >= 0)) { + var subj = objs[0]; + if((pyjslib_len(objs) > 1)) { + + var __obj = new pyjslib_Iterator(objs); + try { + while(true) { + var obj = __obj.next(); + + + this.makeStatement(new pyjslib_Tuple([this._context, this._store.sym(DAML_sameAs_URI), subj, obj])); + + } + } catch(e) { + if(e != StopIteration) { + throw e; + } } - this._anonymousNodes = parentAnonymousNodes; - this._variables = this._parentVariables; - this._parentVariables = grandParentVariables; - this._context = this._parentContext; - this._reason2 = reason2; - this._parentContext = oldParentContext; - res.push(subj.close()); - return j; - } - } - if ((ch == "(")) { - var thing_type = this._store.list; - var ch2 = pyjslib_slice(str, ( i + 1 ) , ( i + 2 ) ); - if ((ch2 == "$")) { - var thing_type = this._store.newSet; - i += 1; - } - var j = ( i + 1 ) ; + + } + var j = this.skipSpace(str, j); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when objectList expected after [ = "); + } + if((pyjslib_slice(str, j, (j + 1)) == ";")) { + var j = (j + 1); + } + } else { + throw BadSyntax(this._thisDoc, this.lines, str, i, "objectList expected after [= "); + } + } + if((subj == null)) { + var subj = this.blankNode(bnodeID); + } + var i = this.property_list(str, j, subj); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "property_list expected"); + } + var j = this.skipSpace(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF when ']' expected after [ <propertyList>"); + } + if((pyjslib_slice(str, j, (j + 1)) != "]")) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "']' expected"); + } + res.push(subj); + return(j + 1); + } + if((ch == "{")) { + var ch2 = pyjslib_slice(str, (i + 1), (i + 2)); + if((ch2 == "$")) { + i += 1; + var j = (i + 1); var mylist = new pyjslib_List([]); - while (1) { - var i = this.skipSpace(str, j); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "needed ')', found end."); - } - if ((pyjslib_slice(str, i, ( i + 1 ) ) == ")")) { - var j = ( i + 1 ) ; - break; - } - var item = new pyjslib_List([]); - var j = this.item(str, i, item); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in list or ')'"); + var first_run = true; + while(1) { + var i = this.skipSpace(str, j); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '$}', found end."); + } + if((pyjslib_slice(str, i, (i + 2)) == "$}")) { + var j = (i + 2); + break; + } + if(!(first_run)) { + if((pyjslib_slice(str, i, (i + 1)) == ",")) { + i += 1; + } else { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected: ','"); } - mylist.push(item[0]); - } - res.push(thing_type(mylist, this._context)); + } else { + var first_run = false; + } + var item = new pyjslib_List([]); + var j = this.item(str, i, item); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in set or '$}'"); + } + mylist.push(item[0]); + } + res.push(this._store.newSet(mylist, this._context)); + return j; + } else { + var j = (i + 1); + var oldParentContext = this._parentContext; + this._parentContext = this._context; + var parentAnonymousNodes = this._anonymousNodes; + var grandParentVariables = this._parentVariables; + this._parentVariables = this._variables; + this._anonymousNodes = new pyjslib_Dict([]); + this._variables = this._variables.slice(); + var reason2 = this._reason2; + this._reason2 = becauseSubexpression; + if((subj == null)) { + var subj = this._store.formula(); + } + this._context = subj; + while(1) { + var i = this.skipSpace(str, j); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "needed '}', found end."); + } + if((pyjslib_slice(str, i, (i + 1)) == "}")) { + var j = (i + 1); + break; + } + var j = this.directiveOrStatement(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected statement or '}'"); + } + } + this._anonymousNodes = parentAnonymousNodes; + this._variables = this._parentVariables; + this._parentVariables = grandParentVariables; + this._context = this._parentContext; + this._reason2 = reason2; + this._parentContext = oldParentContext; + res.push(subj.close()); return j; + } + } + if((ch == "(")) { + var thing_type = this._store.list; + var ch2 = pyjslib_slice(str, (i + 1), (i + 2)); + if((ch2 == "$")) { + var thing_type = this._store.newSet; + i += 1; + } + var j = (i + 1); + var mylist = new pyjslib_List([]); + while(1) { + var i = this.skipSpace(str, j); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "needed ')', found end."); + } + if((pyjslib_slice(str, i, (i + 1)) == ")")) { + var j = (i + 1); + break; + } + var item = new pyjslib_List([]); + var j = this.item(str, i, item); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "expected item in list or ')'"); + } + mylist.push(item[0]); + } + res.push(thing_type(mylist, this._context)); + return j; } var j = this.tok("this", str, i); - if ((j >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Keyword 'this' was ancient N3. Now use @forSome and @forAll keywords."); - res.push(this._context); - return j; + if((j >= 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "Keyword 'this' was ancient N3. Now use @forSome and @forAll keywords."); + res.push(this._context); + return j; } var j = this.tok("true", str, i); - if ((j >= 0)) { - res.push(true); - return j; + if((j >= 0)) { + res.push(true); + return j; } var j = this.tok("false", str, i); - if ((j >= 0)) { - res.push(false); - return j; + if((j >= 0)) { + res.push(false); + return j; } - if ((subj == null)) { - var j = this.uri_ref2(str, i, res); - if ((j >= 0)) { - return j; - } + if((subj == null)) { + var j = this.uri_ref2(str, i, res); + if((j >= 0)) { + return j; + } } return -1; -}; -__SinkParser.prototype.property_list = function(str, i, subj) { + }; + __SinkParser.prototype.property_list = function (str, i, subj) { /* Parse property list Leaves the terminating punctuation in the buffer */ - - while (1) { - var j = this.skipSpace(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found when expected verb in property list"); - return j; - } - if ((pyjslib_slice(str, j, ( j + 2 ) ) == ":-")) { - var i = ( j + 2 ) ; - var res = new pyjslib_List([]); - var j = this.node(str, i, res, subj); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad {} or () or [] node after :- "); - } - var i = j; - continue; + + while(1) { + var j = this.skipSpace(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found when expected verb in property list"); + return j; + } + if((pyjslib_slice(str, j, (j + 2)) == ":-")) { + var i = (j + 2); + var res = new pyjslib_List([]); + var j = this.node(str, i, res, subj); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "bad {} or () or [] node after :- "); } var i = j; - var v = new pyjslib_List([]); - var j = this.verb(str, i, v); - if ((j <= 0)) { - return i; - } - var objs = new pyjslib_List([]); - var i = this.objectList(str, j, objs); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "objectList expected"); - } - - var __obj = new pyjslib_Iterator(objs); - try { - while (true) { - var obj = __obj.next(); - - - var pairFudge = v[0]; - var dir = pairFudge[0]; - var sym = pairFudge[1]; - if ((dir == "->")) { - this.makeStatement(new pyjslib_Tuple([this._context, sym, subj, obj])); - } - else { - this.makeStatement(new pyjslib_Tuple([this._context, sym, obj, subj])); - } - - } - } catch (e) { - if (e != StopIteration) { - throw e; - } - } - - var j = this.skipSpace(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in list of objects"); - return j; + continue; + } + var i = j; + var v = new pyjslib_List([]); + var j = this.verb(str, i, v); + if((j <= 0)) { + return i; + } + var objs = new pyjslib_List([]); + var i = this.objectList(str, j, objs); + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "objectList expected"); + } + + var __obj = new pyjslib_Iterator(objs); + try { + while(true) { + var obj = __obj.next(); + + + var pairFudge = v[0]; + var dir = pairFudge[0]; + var sym = pairFudge[1]; + if((dir == "->")) { + this.makeStatement(new pyjslib_Tuple([this._context, sym, subj, obj])); + } else { + this.makeStatement(new pyjslib_Tuple([this._context, sym, obj, subj])); + } + } - if ((pyjslib_slice(str, i, ( i + 1 ) ) != ";")) { - return i; + } catch(e) { + if(e != StopIteration) { + throw e; } - var i = ( i + 1 ) ; + } + + var j = this.skipSpace(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found in list of objects"); + return j; + } + if((pyjslib_slice(str, i, (i + 1)) != ";")) { + return i; + } + var i = (i + 1); } -}; -__SinkParser.prototype.commaSeparatedList = function(str, j, res, ofUris) { + }; + __SinkParser.prototype.commaSeparatedList = function (str, j, res, ofUris) { /* return value: -1 bad syntax; >1 new position in str res has things found appended @@ -859,86 +848,84 @@ __SinkParser.prototype.commaSeparatedList = function(str, j, res, ofUris) { Used to use a final value of the function to be called, e.g. this.bareWord but passing the function didn't work fo js converion pyjs */ - + var i = this.skipSpace(str, j); - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found expecting comma sep list"); - return i; + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found expecting comma sep list"); + return i; } - if ((str.charAt(i) == ".")) { - return j; + if((str.charAt(i) == ".")) { + return j; } - if (ofUris) { - var i = this.uri_ref2(str, i, res); + if(ofUris) { + var i = this.uri_ref2(str, i, res); + } else { + var i = this.bareWord(str, i, res); } - else { - var i = this.bareWord(str, i, res); + if((i < 0)) { + return -1; } - if ((i < 0)) { - return -1; - } - while (1) { - var j = this.skipSpace(str, i); - if ((j < 0)) { - return j; - } - var ch = pyjslib_slice(str, j, ( j + 1 ) ); - if ((ch != ",")) { - if ((ch != ".")) { - return -1; - } - return j; - } - if (ofUris) { - var i = this.uri_ref2(str, ( j + 1 ) , res); - } - else { - var i = this.bareWord(str, ( j + 1 ) , res); - } - if ((i < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad list content"); - return i; + while(1) { + var j = this.skipSpace(str, i); + if((j < 0)) { + return j; + } + var ch = pyjslib_slice(str, j, (j + 1)); + if((ch != ",")) { + if((ch != ".")) { + return -1; } + return j; + } + if(ofUris) { + var i = this.uri_ref2(str, (j + 1), res); + } else { + var i = this.bareWord(str, (j + 1), res); + } + if((i < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "bad list content"); + return i; + } } -}; -__SinkParser.prototype.objectList = function(str, i, res) { + }; + __SinkParser.prototype.objectList = function (str, i, res) { var i = this.object(str, i, res); - if ((i < 0)) { - return -1; + if((i < 0)) { + return -1; } - while (1) { - var j = this.skipSpace(str, i); - if ((j < 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found after object"); - return j; - } - if ((pyjslib_slice(str, j, ( j + 1 ) ) != ",")) { - return j; - } - var i = this.object(str, ( j + 1 ) , res); - if ((i < 0)) { - return i; - } + while(1) { + var j = this.skipSpace(str, i); + if((j < 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, "EOF found after object"); + return j; + } + if((pyjslib_slice(str, j, (j + 1)) != ",")) { + return j; + } + var i = this.object(str, (j + 1), res); + if((i < 0)) { + return i; + } } -}; -__SinkParser.prototype.checkDot = function(str, i) { + }; + __SinkParser.prototype.checkDot = function (str, i) { var j = this.skipSpace(str, i); - if ((j < 0)) { - return j; + if((j < 0)) { + return j; } - if ((pyjslib_slice(str, j, ( j + 1 ) ) == ".")) { - return ( j + 1 ) ; + if((pyjslib_slice(str, j, (j + 1)) == ".")) { + return(j + 1); } - if ((pyjslib_slice(str, j, ( j + 1 ) ) == "}")) { - return j; + if((pyjslib_slice(str, j, (j + 1)) == "}")) { + return j; } - if ((pyjslib_slice(str, j, ( j + 1 ) ) == "]")) { - return j; + if((pyjslib_slice(str, j, (j + 1)) == "]")) { + return j; } throw BadSyntax(this._thisDoc, this.lines, str, j, "expected '.' or '}' or ']' at end of statement"); return i; -}; -__SinkParser.prototype.uri_ref2 = function(str, i, res) { + }; + __SinkParser.prototype.uri_ref2 = function (str, i, res) { /* Generate uri from n3 representation. @@ -946,479 +933,452 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) { NS and local name is now used though I prefer inserting a '#' to make the namesapces look more like what XML folks expect. */ - + var qn = new pyjslib_List([]); var j = this.qname(str, i, qn); - if ((j >= 0)) { - var pairFudge = qn[0]; - var pfx = pairFudge[0]; - var ln = pairFudge[1]; - if ((pfx == null)) { - assertFudge(0, "not used?"); - var ns = ( this._baseURI + ADDED_HASH ) ; - } - else { - var ns = this._bindings[pfx]; - if (!(ns)) { - if ((pfx == "_")) { - res.push(this.anonymousNode(ln)); - return j; - } - throw BadSyntax(this._thisDoc, this.lines, str, i, ( ( "Prefix " + pfx ) + " not bound." ) ); - } - } - var symb = this._store.sym( ( ns + ln ) ); - if (($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) { - res.push(this._variables[symb]); - } - else { - res.push(symb); - } - return j; - } - var i = this.skipSpace(str, i); - if ((i < 0)) { - return -1; - } - if ((str.charAt(i) == "?")) { - var v = new pyjslib_List([]); - var j = this.variable(str, i, v); - if ((j > 0)) { - res.push(v[0]); + if((j >= 0)) { + var pairFudge = qn[0]; + var pfx = pairFudge[0]; + var ln = pairFudge[1]; + if((pfx == null)) { + assertFudge(0, "not used?"); + var ns = (this._baseURI + ADDED_HASH); + } else { + var ns = this._bindings[pfx]; + if(!(ns)) { + if((pfx == "_")) { + res.push(this.anonymousNode(ln)); return j; - } - return -1; - } - else if ((str.charAt(i) == "<")) { - var i = ( i + 1 ) ; - var st = i; - while ((i < pyjslib_len(str))) { - if ((str.charAt(i) == ">")) { - var uref = pyjslib_slice(str, st, i); - if (this._baseURI) { - var uref = uripath_join(this._baseURI, uref); - } - else { - assertFudge((uref.indexOf(":") >= 0), "With no base URI, cannot deal with relative URIs"); - } - if ((pyjslib_slice(str, ( i - 1 ) , i) == "#") && !((pyjslib_slice(uref, -1, null) == "#"))) { - var uref = ( uref + "#" ) ; - } - var symb = this._store.sym(uref); - if (($rdf.Util.ArrayIndexOf(this._variables,symb) >= 0)) { - res.push(this._variables[symb]); - } - else { - res.push(symb); - } - return ( i + 1 ) ; - } - var i = ( i + 1 ) ; - } - throw BadSyntax(this._thisDoc, this.lines, str, j, "unterminated URI reference"); + } + throw BadSyntax(this._thisDoc, this.lines, str, i, (("Prefix " + pfx) + " not bound.")); + } + } + var symb = this._store.sym((ns + ln)); + if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) { + res.push(this._variables[symb]); + } else { + res.push(symb); + } + return j; } - else if (this.keywordsSet) { - var v = new pyjslib_List([]); - var j = this.bareWord(str, i, v); - if ((j < 0)) { - return -1; - } - if (($rdf.Util.ArrayIndexOf(this.keywords, v[0]) >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, ( ( "Keyword \"" + v[0] ) + "\" not allowed here." ) ); - } - res.push(this._store.sym( ( this._bindings[""] + v[0] ) )); + var i = this.skipSpace(str, i); + if((i < 0)) { + return -1; + } + if((str.charAt(i) == "?")) { + var v = new pyjslib_List([]); + var j = this.variable(str, i, v); + if((j > 0)) { + res.push(v[0]); return j; - } - else { + } + return -1; + } else if((str.charAt(i) == "<")) { + var i = (i + 1); + var st = i; + while((i < pyjslib_len(str))) { + if((str.charAt(i) == ">")) { + var uref = pyjslib_slice(str, st, i); + if(this._baseURI) { + var uref = uripath_join(this._baseURI, uref); + } else { + assertFudge((uref.indexOf(":") >= 0), "With no base URI, cannot deal with relative URIs"); + } + if((pyjslib_slice(str, (i - 1), i) == "#") && !((pyjslib_slice(uref, -1, null) == "#"))) { + var uref = (uref + "#"); + } + var symb = this._store.sym(uref); + if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) { + res.push(this._variables[symb]); + } else { + res.push(symb); + } + return(i + 1); + } + var i = (i + 1); + } + throw BadSyntax(this._thisDoc, this.lines, str, j, "unterminated URI reference"); + } else if(this.keywordsSet) { + var v = new pyjslib_List([]); + var j = this.bareWord(str, i, v); + if((j < 0)) { return -1; - } -}; -__SinkParser.prototype.skipSpace = function(str, i) { + } + if(($rdf.Util.ArrayIndexOf(this.keywords, v[0]) >= 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, (("Keyword \"" + v[0]) + "\" not allowed here.")); + } + res.push(this._store.sym((this._bindings[""] + v[0]))); + return j; + } else { + return -1; + } + }; + __SinkParser.prototype.skipSpace = function (str, i) { /* Skip white space, newlines and comments. return -1 if EOF, else position of first non-ws character*/ var tmp = str; var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000'; - for (var j = (i ? i : 0); j < str.length; j++) { - if (whitespace.indexOf(str.charAt(j)) === -1) { - if( str.charAt(j)==='#' ) { - str = str.slice(i).replace(/^[^\n]*\n/,""); - i=0; - j=-1; - } else { - break; - } + for(var j = (i ? i : 0); j < str.length; j++) { + if(whitespace.indexOf(str.charAt(j)) === -1) { + if(str.charAt(j) === '#') { + str = str.slice(i).replace(/^[^\n]*\n/, ""); + i = 0; + j = -1; + } else { + break; } + } } var val = (tmp.length - str.length) + j; - if( val === tmp.length ) { - return -1; + if(val === tmp.length) { + return -1; } return val; -}; -__SinkParser.prototype.variable = function(str, i, res) { + }; + __SinkParser.prototype.variable = function (str, i, res) { /* ?abc -> variable(:abc) */ - + var j = this.skipSpace(str, i); - if ((j < 0)) { - return -1; + if((j < 0)) { + return -1; } - if ((pyjslib_slice(str, j, ( j + 1 ) ) != "?")) { - return -1; + if((pyjslib_slice(str, j, (j + 1)) != "?")) { + return -1; } - var j = ( j + 1 ) ; + var j = (j + 1); var i = j; - if (("0123456789-".indexOf(str.charAt(j)) >= 0)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, ( ( "Varible name can't start with '" + str.charAt(j) ) + "s'" ) ); - return -1; + if(("0123456789-".indexOf(str.charAt(j)) >= 0)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, (("Varible name can't start with '" + str.charAt(j)) + "s'")); + return -1; } - while ((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { - var i = ( i + 1 ) ; + while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { + var i = (i + 1); } - if ((this._parentContext == null)) { - throw BadSyntax(this._thisDoc, this.lines, str, j, ( "Can't use ?xxx syntax for variable in outermost level: " + pyjslib_slice(str, ( j - 1 ) , i) ) ); + if((this._parentContext == null)) { + throw BadSyntax(this._thisDoc, this.lines, str, j, ("Can't use ?xxx syntax for variable in outermost level: " + pyjslib_slice(str, (j - 1), i))); } res.push(this._store.variable(pyjslib_slice(str, j, i))); return i; -}; -__SinkParser.prototype.bareWord = function(str, i, res) { + }; + __SinkParser.prototype.bareWord = function (str, i, res) { /* abc -> :abc */ - + var j = this.skipSpace(str, i); - if ((j < 0)) { - return -1; + if((j < 0)) { + return -1; } var ch = str.charAt(j); - if (("0123456789-".indexOf(ch) >= 0)) { - return -1; + if(("0123456789-".indexOf(ch) >= 0)) { + return -1; } - if ((_notNameChars.indexOf(ch) >= 0)) { - return -1; + if((_notNameChars.indexOf(ch) >= 0)) { + return -1; } var i = j; - while ((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { - var i = ( i + 1 ) ; + while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) { + var i = (i + 1); } res.push(pyjslib_slice(str, j, i)); return i; -}; -__SinkParser.prototype.qname = function(str, i, res) { + }; + __SinkParser.prototype.qname = function (str, i, res) { /* xyz:def -> ('xyz', 'def') If not in keywords and keywordsSet: def -> ('', 'def') :def -> ('', 'def') */ - + var i = this.skipSpace(str, i); - if ((i < 0)) { - return -1; + if((i < 0)) { + return -1; } var c = str.charAt(i); - if (("0123456789-+".indexOf(c) >= 0)) { - return -1; - } - if ((_notNameChars.indexOf(c) < 0)) { - var ln = c; - var i = ( i + 1 ) ; - while ((i < pyjslib_len(str))) { - var c = str.charAt(i); - if ((_notNameChars.indexOf(c) < 0)) { - var ln = ( ln + c ) ; - var i = ( i + 1 ) ; - } - else { - break; - } - } - } - else { - var ln = ""; - } - if ((i < pyjslib_len(str)) && (str.charAt(i) == ":")) { - var pfx = ln; - var i = ( i + 1 ) ; - var ln = ""; - while ((i < pyjslib_len(str))) { - var c = str.charAt(i); - if ((_notNameChars.indexOf(c) < 0)) { - var ln = ( ln + c ) ; - var i = ( i + 1 ) ; - } - else { - break; - } - } - res.push(new pyjslib_Tuple([pfx, ln])); + if(("0123456789-+".indexOf(c) >= 0)) { + return -1; + } + if((_notNameChars.indexOf(c) < 0)) { + var ln = c; + var i = (i + 1); + while((i < pyjslib_len(str))) { + var c = str.charAt(i); + if((_notNameChars.indexOf(c) < 0)) { + var ln = (ln + c); + var i = (i + 1); + } else { + break; + } + } + } else { + var ln = ""; + } + if((i < pyjslib_len(str)) && (str.charAt(i) == ":")) { + var pfx = ln; + var i = (i + 1); + var ln = ""; + while((i < pyjslib_len(str))) { + var c = str.charAt(i); + if((_notNameChars.indexOf(c) < 0)) { + var ln = (ln + c); + var i = (i + 1); + } else { + break; + } + } + res.push(new pyjslib_Tuple([pfx, ln])); + return i; + } else { + if(ln && this.keywordsSet && ($rdf.Util.ArrayIndexOf(this.keywords, ln) < 0)) { + res.push(new pyjslib_Tuple(["", ln])); return i; + } + return -1; } - else { - if (ln && this.keywordsSet && ($rdf.Util.ArrayIndexOf(this.keywords, ln) < 0)) { - res.push(new pyjslib_Tuple(["", ln])); - return i; - } - return -1; - } -}; -__SinkParser.prototype.object = function(str, i, res) { + }; + __SinkParser.prototype.object = function (str, i, res) { var j = this.subject(str, i, res); - if ((j >= 0)) { + if((j >= 0)) { + return j; + } else { + var j = this.skipSpace(str, i); + if((j < 0)) { + return -1; + } else { + var i = j; + } + if((str.charAt(i) == "\"")) { + if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) { + var delim = "\"\"\""; + } else { + var delim = "\""; + } + var i = (i + pyjslib_len(delim)); + var pairFudge = this.strconst(str, i, delim); + var j = pairFudge[0]; + var s = pairFudge[1]; + res.push(this._store.literal(s)); + diag_progress("New string const ", s, j); return j; + } else { + return -1; + } } - else { - var j = this.skipSpace(str, i); - if ((j < 0)) { - return -1; - } - else { - var i = j; - } - if ((str.charAt(i) == "\"")) { - if ((pyjslib_slice(str, i, ( i + 3 ) ) == "\"\"\"")) { - var delim = "\"\"\""; - } - else { - var delim = "\""; - } - var i = ( i + pyjslib_len(delim) ) ; - var pairFudge = this.strconst(str, i, delim); - var j = pairFudge[0]; - var s = pairFudge[1]; - res.push(this._store.literal(s)); - diag_progress("New string const ", s, j); - return j; - } - else { - return -1; - } - } -}; -__SinkParser.prototype.nodeOrLiteral = function(str, i, res) { + }; + __SinkParser.prototype.nodeOrLiteral = function (str, i, res) { var j = this.node(str, i, res); - if ((j >= 0)) { - return j; - } - else { - var j = this.skipSpace(str, i); - if ((j < 0)) { - return -1; - } - else { - var i = j; - } - var ch = str.charAt(i); - if (("-+0987654321".indexOf(ch) >= 0)) { - number_syntax.lastIndex = 0; - var m = number_syntax.exec(str.slice(i)); - if ((m == null)) { - throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad number syntax"); - } - var j = ( i + number_syntax.lastIndex ) ; - var val = pyjslib_slice(str, i, j); - if ((val.indexOf("e") >= 0)) { - res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(FLOAT_DATATYPE))); - } - else if ((pyjslib_slice(str, i, j).indexOf(".") >= 0)) { - res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(DECIMAL_DATATYPE))); - } - else { - res.push(this._store.literal(parseInt(val), undefined, this._store.sym(INTEGER_DATATYPE))); - } - return j; + if((j >= 0)) { + return j; + } else { + var j = this.skipSpace(str, i); + if((j < 0)) { + return -1; + } else { + var i = j; + } + var ch = str.charAt(i); + if(("-+0987654321".indexOf(ch) >= 0)) { + number_syntax.lastIndex = 0; + var m = number_syntax.exec(str.slice(i)); + if((m == null)) { + throw BadSyntax(this._thisDoc, this.lines, str, i, "Bad number syntax"); + } + var j = (i + number_syntax.lastIndex); + var val = pyjslib_slice(str, i, j); + if((val.indexOf("e") >= 0)) { + res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(FLOAT_DATATYPE))); + } else if((pyjslib_slice(str, i, j).indexOf(".") >= 0)) { + res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(DECIMAL_DATATYPE))); + } else { + res.push(this._store.literal(parseInt(val), undefined, this._store.sym(INTEGER_DATATYPE))); } - if ((str.charAt(i) == "\"")) { - if ((pyjslib_slice(str, i, ( i + 3 ) ) == "\"\"\"")) { - var delim = "\"\"\""; - } - else { - var delim = "\""; - } - var i = ( i + pyjslib_len(delim) ) ; - var dt = null; - var pairFudge = this.strconst(str, i, delim); - var j = pairFudge[0]; - var s = pairFudge[1]; - var lang = null; - if ((pyjslib_slice(str, j, ( j + 1 ) ) == "@")) { - langcode.lastIndex = 0; - - var m = langcode.exec(str.slice( ( j + 1 ) )); - if ((m == null)) { - throw BadSyntax(this._thisDoc, startline, str, i, "Bad language code syntax on string literal, after @"); - } - var i = ( ( langcode.lastIndex + j ) + 1 ) ; - - var lang = pyjslib_slice(str, ( j + 1 ) , i); - var j = i; - } - if ((pyjslib_slice(str, j, ( j + 2 ) ) == "^^")) { - var res2 = new pyjslib_List([]); - var j = this.uri_ref2(str, ( j + 2 ) , res2); - var dt = res2[0]; - } - res.push(this._store.literal(s, lang, dt)); - return j; + return j; + } + if((str.charAt(i) == "\"")) { + if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) { + var delim = "\"\"\""; + } else { + var delim = "\""; + } + var i = (i + pyjslib_len(delim)); + var dt = null; + var pairFudge = this.strconst(str, i, delim); + var j = pairFudge[0]; + var s = pairFudge[1]; + var lang = null; + if((pyjslib_slice(str, j, (j + 1)) == "@")) { + langcode.lastIndex = 0; + + var m = langcode.exec(str.slice((j + 1))); + if((m == null)) { + throw BadSyntax(this._thisDoc, startline, str, i, "Bad language code syntax on string literal, after @"); + } + var i = ((langcode.lastIndex + j) + 1); + + var lang = pyjslib_slice(str, (j + 1), i); + var j = i; } - else { - return -1; + if((pyjslib_slice(str, j, (j + 2)) == "^^")) { + var res2 = new pyjslib_List([]); + var j = this.uri_ref2(str, (j + 2), res2); + var dt = res2[0]; } + res.push(this._store.literal(s, lang, dt)); + return j; + } else { + return -1; + } } -}; -__SinkParser.prototype.strconst = function(str, i, delim) { + }; + __SinkParser.prototype.strconst = function (str, i, delim) { /* parse an N3 string constant delimited by delim. return index, val */ - + var j = i; var ustr = ""; var startline = this.lines; - while ((j < pyjslib_len(str))) { - var i = ( j + pyjslib_len(delim) ) ; - if ((pyjslib_slice(str, j, i) == delim)) { - return new pyjslib_Tuple([i, ustr]); - } - if ((str.charAt(j) == "\"")) { - var ustr = ( ustr + "\"" ) ; - var j = ( j + 1 ) ; - continue; - } - interesting.lastIndex = 0; - var m = interesting.exec(str.slice(j)); - if (!(m)) { - throw BadSyntax(this._thisDoc, startline, str, j, ( ( ( "Closing quote missing in string at ^ in " + pyjslib_slice(str, ( j - 20 ) , j) ) + "^" ) + pyjslib_slice(str, j, ( j + 20 ) ) ) ); - } - var i = ( ( j + interesting.lastIndex ) - 1 ) ; - var ustr = ( ustr + pyjslib_slice(str, j, i) ) ; - var ch = str.charAt(i); - if ((ch == "\"")) { - var j = i; - continue; - } - else if ((ch == "\r")) { - var j = ( i + 1 ) ; - continue; - } - else if ((ch == "\n")) { - if ((delim == "\"")) { - throw BadSyntax(this._thisDoc, startline, str, i, "newline found in string literal"); - } - this.lines = ( this.lines + 1 ) ; - var ustr = ( ustr + ch ) ; - var j = ( i + 1 ) ; - this.previousLine = this.startOfLine; - this.startOfLine = j; - } - else if ((ch == "\\")) { - var j = ( i + 1 ) ; - var ch = pyjslib_slice(str, j, ( j + 1 ) ); - if (!(ch)) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal (2)"); - } - var k = string_find("abfrtvn\\\"", ch); - if ((k >= 0)) { - var uch = "\a\b\f\r\t\v\n\\\"".charAt(k); - var ustr = ( ustr + uch ) ; - var j = ( j + 1 ) ; - } - else if ((ch == "u")) { - var pairFudge = this.uEscape(str, ( j + 1 ) , startline); - var j = pairFudge[0]; - var ch = pairFudge[1]; - var ustr = ( ustr + ch ) ; - } - else if ((ch == "U")) { - var pairFudge = this.UEscape(str, ( j + 1 ) , startline); - var j = pairFudge[0]; - var ch = pairFudge[1]; - var ustr = ( ustr + ch ) ; - } - else { - throw BadSyntax(this._thisDoc, this.lines, str, i, "bad escape"); - } - } + while((j < pyjslib_len(str))) { + var i = (j + pyjslib_len(delim)); + if((pyjslib_slice(str, j, i) == delim)) { + return new pyjslib_Tuple([i, ustr]); + } + if((str.charAt(j) == "\"")) { + var ustr = (ustr + "\""); + var j = (j + 1); + continue; + } + interesting.lastIndex = 0; + var m = interesting.exec(str.slice(j)); + if(!(m)) { + throw BadSyntax(this._thisDoc, startline, str, j, ((("Closing quote missing in string at ^ in " + pyjslib_slice(str, (j - 20), j)) + "^") + pyjslib_slice(str, j, (j + 20)))); + } + var i = ((j + interesting.lastIndex) - 1); + var ustr = (ustr + pyjslib_slice(str, j, i)); + var ch = str.charAt(i); + if((ch == "\"")) { + var j = i; + continue; + } else if((ch == "\r")) { + var j = (i + 1); + continue; + } else if((ch == "\n")) { + if((delim == "\"")) { + throw BadSyntax(this._thisDoc, startline, str, i, "newline found in string literal"); + } + this.lines = (this.lines + 1); + var ustr = (ustr + ch); + var j = (i + 1); + this.previousLine = this.startOfLine; + this.startOfLine = j; + } else if((ch == "\\")) { + var j = (i + 1); + var ch = pyjslib_slice(str, j, (j + 1)); + if(!(ch)) { + throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal (2)"); + } + var k = string_find("abfrtvn\\\"", ch); + if((k >= 0)) { + var uch = "\a\b\f\r\t\v\n\\\"".charAt(k); + var ustr = (ustr + uch); + var j = (j + 1); + } else if((ch == "u")) { + var pairFudge = this.uEscape(str, (j + 1), startline); + var j = pairFudge[0]; + var ch = pairFudge[1]; + var ustr = (ustr + ch); + } else if((ch == "U")) { + var pairFudge = this.UEscape(str, (j + 1), startline); + var j = pairFudge[0]; + var ch = pairFudge[1]; + var ustr = (ustr + ch); + } else { + throw BadSyntax(this._thisDoc, this.lines, str, i, "bad escape"); + } + } } throw BadSyntax(this._thisDoc, this.lines, str, i, "unterminated string literal"); -}; -__SinkParser.prototype.uEscape = function(str, i, startline) { + }; + __SinkParser.prototype.uEscape = function (str, i, startline) { var j = i; var count = 0; var value = 0; - while ((count < 4)) { - var chFudge = pyjslib_slice(str, j, ( j + 1 ) ); - var ch = chFudge.toLowerCase(); - var j = ( j + 1 ) ; - if ((ch == "")) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); - } - var k = string_find("0123456789abcdef", ch); - if ((k < 0)) { - throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); - } - var value = ( ( value * 16 ) + k ) ; - var count = ( count + 1 ) ; + while((count < 4)) { + var chFudge = pyjslib_slice(str, j, (j + 1)); + var ch = chFudge.toLowerCase(); + var j = (j + 1); + if((ch == "")) { + throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); + } + var k = string_find("0123456789abcdef", ch); + if((k < 0)) { + throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); + } + var value = ((value * 16) + k); + var count = (count + 1); } var uch = String.fromCharCode(value); return new pyjslib_Tuple([j, uch]); -}; -__SinkParser.prototype.UEscape = function(str, i, startline) { + }; + __SinkParser.prototype.UEscape = function (str, i, startline) { var j = i; var count = 0; var value = "\\U"; - while ((count < 8)) { - var chFudge = pyjslib_slice(str, j, ( j + 1 ) ); - var ch = chFudge.toLowerCase(); - var j = ( j + 1 ) ; - if ((ch == "")) { - throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); - } - var k = string_find("0123456789abcdef", ch); - if ((k < 0)) { - throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); - } - var value = ( value + ch ) ; - var count = ( count + 1 ) ; - } - var uch = stringFromCharCode( ( ( "0x" + pyjslib_slice(value, 2, 10) ) - 0 ) ); + while((count < 8)) { + var chFudge = pyjslib_slice(str, j, (j + 1)); + var ch = chFudge.toLowerCase(); + var j = (j + 1); + if((ch == "")) { + throw BadSyntax(this._thisDoc, startline, str, i, "unterminated string literal(3)"); + } + var k = string_find("0123456789abcdef", ch); + if((k < 0)) { + throw BadSyntax(this._thisDoc, startline, str, i, "bad string literal hex escape"); + } + var value = (value + ch); + var count = (count + 1); + } + var uch = stringFromCharCode((("0x" + pyjslib_slice(value, 2, 10)) - 0)); return new pyjslib_Tuple([j, uch]); -}; + }; -function BadSyntax(uri, lines, str, i, why) { - return ( ( ( ( ( ( ( ( "Line " + ( lines + 1 ) ) + " of <" ) + uri ) + ">: Bad syntax: " ) + why ) + "\nat: \"" ) + pyjslib_slice(str, i, ( i + 30 ) ) ) + "\"" ) ; -} + function BadSyntax(uri, lines, str, i, why) { + return(((((((("Line " + (lines + 1)) + " of <") + uri) + ">: Bad syntax: ") + why) + "\nat: \"") + pyjslib_slice(str, i, (i + 30))) + "\""); + } -function stripCR(str) { + function stripCR(str) { var res = ""; - + var __ch = new pyjslib_Iterator(str); try { - while (true) { - var ch = __ch.next(); - - - if ((ch != "\r")) { - var res = ( res + ch ) ; - } - - } - } catch (e) { - if (e != StopIteration) { - throw e; + while(true) { + var ch = __ch.next(); + + + if((ch != "\r")) { + var res = (res + ch); } + + } + } catch(e) { + if(e != StopIteration) { + throw e; + } } - + return res; -} + } -function dummyWrite(x) { -} + function dummyWrite(x) { + } -return SinkParser; + return SinkParser; -}(); +}(); +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/rdfparser.js b/chrome/content/zotero/xpcom/rdf/rdfparser.js @@ -62,536 +62,503 @@ * @param {RDFStore} store An RDFStore object */ $rdf.RDFParser = function (store) { - var RDFParser = {}; - - /** Standard namespaces that we know how to handle @final - * @member RDFParser - */ - RDFParser['ns'] = {'RDF': - "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - 'RDFS': - "http://www.w3.org/2000/01/rdf-schema#"} - /** DOM Level 2 node type magic numbers @final - * @member RDFParser - */ - RDFParser['nodeType'] = {'ELEMENT': 1, 'ATTRIBUTE': 2, 'TEXT': 3, - 'CDATA_SECTION': 4, 'ENTITY_REFERENCE': 5, - 'ENTITY': 6, 'PROCESSING_INSTRUCTION': 7, - 'COMMENT': 8, 'DOCUMENT': 9, 'DOCUMENT_TYPE': 10, - 'DOCUMENT_FRAGMENT': 11, 'NOTATION': 12} - - /** - * Frame class for namespace and base URI lookups - * Base lookups will always resolve because the parser knows - * the default base. - * - * @private - */ - this['frameFactory'] = function (parser, parent, element) { - return {'NODE': 1, - 'ARC': 2, - 'parent': parent, - 'parser': parser, - 'store': parser['store'], - 'element': element, - 'lastChild': 0, - 'base': null, - 'lang': null, - 'node': null, - 'nodeType': null, - 'listIndex': 1, - 'rdfid': null, - 'datatype': null, - 'collection': false, - - /** Terminate the frame and notify the store that we're done */ - 'terminateFrame': function () { - if (this['collection']) { - this['node']['close']() - } - }, - - /** Add a symbol of a certain type to the this frame */ - 'addSymbol': function (type, uri) { - uri = $rdf.Util.uri.join(uri, this['base']) - this['node'] = this['store']['sym'](uri) - this['nodeType'] = type - }, - - /** Load any constructed triples into the store */ - 'loadTriple': function () { - if (this['parent']['parent']['collection']) { - this['parent']['parent']['node']['append'](this['node']) - } - else { - this['store']['add'](this['parent']['parent']['node'], - this['parent']['node'], - this['node'], - this['parser']['why']) - } - if (this['parent']['rdfid'] != null) { // reify - var triple = this['store']['sym']( - $rdf.Util.uri.join("#"+this['parent']['rdfid'], - this['base'])) - this['store']['add'](triple, - this['store']['sym']( - RDFParser['ns']['RDF'] - +"type"), - this['store']['sym']( - RDFParser['ns']['RDF'] - +"Statement"), - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym']( - RDFParser['ns']['RDF'] - +"subject"), - this['parent']['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym']( - RDFParser['ns']['RDF'] - +"predicate"), - this['parent']['node'], - this['parser']['why']) - this['store']['add'](triple, - this['store']['sym']( - RDFParser['ns']['RDF'] - +"object"), - this['node'], - this['parser']['why']) - } - }, - - /** Check if it's OK to load a triple */ - 'isTripleToLoad': function () { - return (this['parent'] != null - && this['parent']['parent'] != null - && this['nodeType'] == this['NODE'] - && this['parent']['nodeType'] == this['ARC'] - && this['parent']['parent']['nodeType'] - == this['NODE']) - }, - - /** Add a symbolic node to this frame */ - 'addNode': function (uri) { - this['addSymbol'](this['NODE'],uri) - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection node to this frame */ - 'addCollection': function () { - this['nodeType'] = this['NODE'] - this['node'] = this['store']['collection']() - this['collection'] = true - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add a collection arc to this frame */ - 'addCollectionArc': function () { - this['nodeType'] = this['ARC'] - }, - - /** Add a bnode to this frame */ - 'addBNode': function (id) { - if (id != null) { - if (this['parser']['bnodes'][id] != null) { - this['node'] = this['parser']['bnodes'][id] - } else { - this['node'] = this['parser']['bnodes'][id] = this['store']['bnode']() - } - } else { this['node'] = this['store']['bnode']() } - - this['nodeType'] = this['NODE'] - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - }, - - /** Add an arc or property to this frame */ - 'addArc': function (uri) { - if (uri == RDFParser['ns']['RDF']+"li") { - uri = RDFParser['ns']['RDF']+"_"+this['parent']['listIndex']++ - } - this['addSymbol'](this['ARC'], uri) - }, - - /** Add a literal to this frame */ - 'addLiteral': function (value) { - if (this['parent']['datatype']) { - this['node'] = this['store']['literal']( - value, "", this['store']['sym']( - this['parent']['datatype'])) - } - else { - this['node'] = this['store']['literal']( - value, this['lang']) - } - this['nodeType'] = this['NODE'] - if (this['isTripleToLoad']()) { - this['loadTriple']() - } - } - } - } + var RDFParser = {}; + + /** Standard namespaces that we know how to handle @final + * @member RDFParser + */ + RDFParser['ns'] = { + 'RDF': "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + 'RDFS': "http://www.w3.org/2000/01/rdf-schema#" + } + /** DOM Level 2 node type magic numbers @final + * @member RDFParser + */ + RDFParser['nodeType'] = { + 'ELEMENT': 1, + 'ATTRIBUTE': 2, + 'TEXT': 3, + 'CDATA_SECTION': 4, + 'ENTITY_REFERENCE': 5, + 'ENTITY': 6, + 'PROCESSING_INSTRUCTION': 7, + 'COMMENT': 8, + 'DOCUMENT': 9, + 'DOCUMENT_TYPE': 10, + 'DOCUMENT_FRAGMENT': 11, + 'NOTATION': 12 + } + + /** + * Frame class for namespace and base URI lookups + * Base lookups will always resolve because the parser knows + * the default base. + * + * @private + */ + this['frameFactory'] = function (parser, parent, element) { + return { + 'NODE': 1, + 'ARC': 2, + 'parent': parent, + 'parser': parser, + 'store': parser['store'], + 'element': element, + 'lastChild': 0, + 'base': null, + 'lang': null, + 'node': null, + 'nodeType': null, + 'listIndex': 1, + 'rdfid': null, + 'datatype': null, + 'collection': false, + + /** Terminate the frame and notify the store that we're done */ + 'terminateFrame': function () { + if(this['collection']) { + this['node']['close']() + } + }, - //from the OpenLayers source .. needed to get around IE problems. - this['getAttributeNodeNS'] = function(node, uri, name) { - var attributeNode = null; - if(node.getAttributeNodeNS) { - attributeNode = node.getAttributeNodeNS(uri, name); + /** Add a symbol of a certain type to the this frame */ + 'addSymbol': function (type, uri) { + uri = $rdf.Util.uri.join(uri, this['base']) + this['node'] = this['store']['sym'](uri) + this['nodeType'] = type + }, + + /** Load any constructed triples into the store */ + 'loadTriple': function () { + if(this['parent']['parent']['collection']) { + this['parent']['parent']['node']['append'](this['node']) } else { - var attributes = node.attributes; - var potentialNode, fullName; - for(var i=0; i<attributes.length; ++i) { - potentialNode = attributes[i]; - if(potentialNode.namespaceURI == uri) { - fullName = (potentialNode.prefix) ? - (potentialNode.prefix + ":" + name) : name; - if(fullName == potentialNode.nodeName) { - attributeNode = potentialNode; - break; - } - } - } + this['store']['add'](this['parent']['parent']['node'], + this['parent']['node'], + this['node'], + this['parser']['why']) + } + if(this['parent']['rdfid'] != null) { // reify + var triple = this['store']['sym']( + $rdf.Util.uri.join("#" + this['parent']['rdfid'], this['base'])) + this['store']['add'](triple, + this['store']['sym'](RDFParser['ns']['RDF'] + "type"), + this['store']['sym'](RDFParser['ns']['RDF'] + "Statement"), + this['parser']['why']) + this['store']['add'](triple, + this['store']['sym'](RDFParser['ns']['RDF'] + "subject"), + this['parent']['parent']['node'], + this['parser']['why']) + this['store']['add'](triple, + this['store']['sym'](RDFParser['ns']['RDF'] + "predicate"), + this['parent']['node'], + this['parser']['why']) + this['store']['add'](triple, + this['store']['sym'](RDFParser['ns']['RDF'] + "object"), + this['node'], + this['parser']['why']) + } + }, + + /** Check if it's OK to load a triple */ + 'isTripleToLoad': function () { + return (this['parent'] != null + && this['parent']['parent'] != null + && this['nodeType'] == this['NODE'] + && this['parent']['nodeType'] == this['ARC'] + && this['parent']['parent']['nodeType'] == this['NODE']) + }, + + /** Add a symbolic node to this frame */ + 'addNode': function (uri) { + this['addSymbol'](this['NODE'], uri) + if(this['isTripleToLoad']()) { + this['loadTriple']() + } + }, + + /** Add a collection node to this frame */ + 'addCollection': function () { + this['nodeType'] = this['NODE'] + this['node'] = this['store']['collection']() + this['collection'] = true + if(this['isTripleToLoad']()) { + this['loadTriple']() + } + }, + + /** Add a collection arc to this frame */ + 'addCollectionArc': function () { + this['nodeType'] = this['ARC'] + }, + + /** Add a bnode to this frame */ + 'addBNode': function (id) { + if(id != null) { + if(this['parser']['bnodes'][id] != null) { + this['node'] = this['parser']['bnodes'][id] + } else { + this['node'] = this['parser']['bnodes'][id] = this['store']['bnode']() + } + } else { + this['node'] = this['store']['bnode']() } - return attributeNode; + + this['nodeType'] = this['NODE'] + if(this['isTripleToLoad']()) { + this['loadTriple']() + } + }, + + /** Add an arc or property to this frame */ + 'addArc': function (uri) { + if(uri == RDFParser['ns']['RDF'] + "li") { + uri = RDFParser['ns']['RDF'] + "_" + this['parent']['listIndex']++ + } + this['addSymbol'](this['ARC'], uri) + }, + + /** Add a literal to this frame */ + 'addLiteral': function (value) { + if(this['parent']['datatype']) { + this['node'] = this['store']['literal']( + value, "", this['store']['sym']( + this['parent']['datatype'])) + } else { + this['node'] = this['store']['literal']( + value, this['lang']) + } + this['nodeType'] = this['NODE'] + if(this['isTripleToLoad']()) { + this['loadTriple']() + } + } } + } - /** Our triple store reference @private */ - this['store'] = store - /** Our identified blank nodes @private */ - this['bnodes'] = {} - /** A context for context-aware stores @private */ - this['why'] = null - /** Reification flag */ - this['reify'] = false - - /** - * Build our initial scope frame and parse the DOM into triples - * @param {DOMTree} document The DOM to parse - * @param {String} base The base URL to use - * @param {Object} why The context to which this resource belongs - */ - this['parse'] = function (document, base, why) { - // alert('parse base:'+base); - var children = document['childNodes'] - - // clean up for the next run - this['cleanParser']() - - // figure out the root element - //var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2 - if (document['nodeType'] == RDFParser['nodeType']['DOCUMENT']) { - for (var c=0; c<children['length']; c++) { - if (children[c]['nodeType'] - == RDFParser['nodeType']['ELEMENT']) { - var root = children[c] - break - } - } - } - else if (document['nodeType'] == RDFParser['nodeType']['ELEMENT']) { - var root = document - } - else { - throw new Error("RDFParser: can't find root in " + base - + ". Halting. ") - return false - } - - this['why'] = why - - - // our topmost frame - - var f = this['frameFactory'](this) - this['base'] = base - f['base'] = base - f['lang'] = '' - - this['parseDOM'](this['buildFrame'](f,root)) - return true + //from the OpenLayers source .. needed to get around IE problems. + this['getAttributeNodeNS'] = function (node, uri, name) { + var attributeNode = null; + if(node.getAttributeNodeNS) { + attributeNode = node.getAttributeNodeNS(uri, name); + } else { + var attributes = node.attributes; + var potentialNode, fullName; + for(var i = 0; i < attributes.length; ++i) { + potentialNode = attributes[i]; + if(potentialNode.namespaceURI == uri) { + fullName = (potentialNode.prefix) ? (potentialNode.prefix + ":" + name) : name; + if(fullName == potentialNode.nodeName) { + attributeNode = potentialNode; + break; + } + } + } + } + return attributeNode; + } + + /** Our triple store reference @private */ + this['store'] = store + /** Our identified blank nodes @private */ + this['bnodes'] = {} + /** A context for context-aware stores @private */ + this['why'] = null + /** Reification flag */ + this['reify'] = false + + /** + * Build our initial scope frame and parse the DOM into triples + * @param {DOMTree} document The DOM to parse + * @param {String} base The base URL to use + * @param {Object} why The context to which this resource belongs + */ + this['parse'] = function (document, base, why) { + // alert('parse base:'+base); + var children = document['childNodes'] + + // clean up for the next run + this['cleanParser']() + + // figure out the root element + //var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2 + if(document['nodeType'] == RDFParser['nodeType']['DOCUMENT']) { + for(var c = 0; c < children['length']; c++) { + if(children[c]['nodeType'] == RDFParser['nodeType']['ELEMENT']) { + var root = children[c] + break + } + } + } else if(document['nodeType'] == RDFParser['nodeType']['ELEMENT']) { + var root = document + } else { + throw new Error("RDFParser: can't find root in " + base + ". Halting. ") + return false } - this['parseDOM'] = function (frame) { - // a DOM utility function used in parsing - var elementURI = function (el) { + + this['why'] = why + + + // our topmost frame + var f = this['frameFactory'](this) + this['base'] = base + f['base'] = base + f['lang'] = '' + + this['parseDOM'](this['buildFrame'](f, root)) + return true + } + this['parseDOM'] = function (frame) { + // a DOM utility function used in parsing + var elementURI = function (el) { var result = ""; - if (el['namespaceURI'] == null) { - throw new Error("RDF/XML syntax error: No namespace for " - +el['localName']+" in "+this.base) + if(el['namespaceURI'] == null) { + throw new Error("RDF/XML syntax error: No namespace for " + + el['localName'] + " in " + this.base) + } + if(el['namespaceURI']) { + result = result + el['namespaceURI']; + } + if(el['localName']) { + result = result + el['localName']; + } else if(el['nodeName']) { + if(el['nodeName'].indexOf(":") >= 0) + result = result + el['nodeName'].split(":")[1]; + else + result = result + el['nodeName']; + } + return result; + } + var dig = true // if we'll dig down in the tree on the next iter + while(frame['parent']) { + var dom = frame['element'] + var attrs = dom['attributes'] + + if(dom['nodeType'] == RDFParser['nodeType']['TEXT'] + || dom['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { + //we have a literal + frame['addLiteral'](dom['nodeValue']) + } else if(elementURI(dom) != RDFParser['ns']['RDF'] + "RDF") { + // not root + if(frame['parent'] && frame['parent']['collection']) { + // we're a collection element + frame['addCollectionArc']() + frame = this['buildFrame'](frame, frame['element']) + frame['parent']['element'] = null + } + if(!frame['parent'] || !frame['parent']['nodeType'] + || frame['parent']['nodeType'] == frame['ARC']) { + // we need a node + var about = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "about") + var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") + if(about && rdfid) { + throw new Error("RDFParser: " + dom['nodeName'] + + " has both rdf:id and rdf:about." + " Halting. Only one of these" + + " properties may be specified on a" + " node."); + } + if(about == null && rdfid) { + frame['addNode']("#" + rdfid['nodeValue']) + dom['removeAttributeNode'](rdfid) + } else if(about == null && rdfid == null) { + var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") + if(bnid) { + frame['addBNode'](bnid['nodeValue']) + dom['removeAttributeNode'](bnid) + } else { + frame['addBNode']() + } + } else { + frame['addNode'](about['nodeValue']) + dom['removeAttributeNode'](about) + } + + // Typed nodes + var rdftype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "type") + if(RDFParser['ns']['RDF'] + "Description" != elementURI(dom)) { + rdftype = { + 'nodeValue': elementURI(dom) + } + } + if(rdftype != null) { + this['store']['add'](frame['node'], + this['store']['sym'](RDFParser['ns']['RDF'] + "type"), + this['store']['sym']( + $rdf.Util.uri.join( + rdftype['nodeValue'], + frame['base'])), + this['why']) + if(rdftype['nodeName']) { + dom['removeAttributeNode'](rdftype) + } + } + + // Property Attributes + for(var x = attrs['length'] - 1; x >= 0; x--) { + this['store']['add'](frame['node'], + this['store']['sym'](elementURI(attrs[x])), + this['store']['literal']( + attrs[x]['nodeValue'], + frame['lang']), + this['why']) + } + } else { + // we should add an arc (or implicit bnode+arc) + frame['addArc'](elementURI(dom)) + + // save the arc's rdf:ID if it has one + if(this['reify']) { + var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID") + if(rdfid) { + frame['rdfid'] = rdfid['nodeValue'] + dom['removeAttributeNode'](rdfid) + } + } + + var parsetype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "parseType") + var datatype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "datatype") + if(datatype) { + frame['datatype'] = datatype['nodeValue'] + dom['removeAttributeNode'](datatype) + } + + if(parsetype) { + var nv = parsetype['nodeValue'] + if(nv == "Literal") { + frame['datatype'] = RDFParser['ns']['RDF'] + "XMLLiteral" + // (this.buildFrame(frame)).addLiteral(dom) + // should work but doesn't + frame = this['buildFrame'](frame) + frame['addLiteral'](dom) + dig = false + } else if(nv == "Resource") { + frame = this['buildFrame'](frame, frame['element']) + frame['parent']['element'] = null + frame['addBNode']() + } else if(nv == "Collection") { + frame = this['buildFrame'](frame, frame['element']) + frame['parent']['element'] = null + frame['addCollection']() + } + dom['removeAttributeNode'](parsetype) + } + + if(attrs['length'] != 0) { + var resource = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "resource") + var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID") + + frame = this['buildFrame'](frame) + if(resource) { + frame['addNode'](resource['nodeValue']) + dom['removeAttributeNode'](resource) + } else { + if(bnid) { + frame['addBNode'](bnid['nodeValue']) + dom['removeAttributeNode'](bnid) + } else { + frame['addBNode']() + } } - if( el['namespaceURI'] ) { - result = result + el['namespaceURI']; + + for(var x = attrs['length'] - 1; x >= 0; x--) { + var f = this['buildFrame'](frame) + f['addArc'](elementURI(attrs[x])) + if(elementURI(attrs[x]) == RDFParser['ns']['RDF'] + "type") { + (this['buildFrame'](f))['addNode']( + attrs[x]['nodeValue']) + } else { + (this['buildFrame'](f))['addLiteral']( + attrs[x]['nodeValue']) + } + } + } else if(dom['childNodes']['length'] == 0) { + (this['buildFrame'](frame))['addLiteral']("") + } } - if( el['localName'] ) { - result = result + el['localName']; - } else if( el['nodeName'] ) { - if(el['nodeName'].indexOf(":")>=0) - result = result + el['nodeName'].split(":")[1]; - else - result = result + el['nodeName']; + } // rdf:RDF + // dig dug + dom = frame['element'] + while(frame['parent']) { + var pframe = frame + while(dom == null) { + frame = frame['parent'] + dom = frame['element'] + } + var candidate = dom['childNodes'][frame['lastChild']] + if(candidate == null || !dig) { + frame['terminateFrame']() + if(!(frame = frame['parent'])) { + break + } // done + dom = frame['element'] + dig = true + } else if((candidate['nodeType'] != RDFParser['nodeType']['ELEMENT'] + && candidate['nodeType'] != RDFParser['nodeType']['TEXT'] + && candidate['nodeType'] != RDFParser['nodeType']['CDATA_SECTION']) + || ((candidate['nodeType'] == RDFParser['nodeType']['TEXT'] + || candidate['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) + && dom['childNodes']['length'] != 1)) { + frame['lastChild']++ + } else { + // not a leaf + frame['lastChild']++; + frame = this['buildFrame'](pframe, dom['childNodes'][frame['lastChild'] - 1]) + break } - return result; - } - var dig = true // if we'll dig down in the tree on the next iter - - while (frame['parent']) { - var dom = frame['element'] - var attrs = dom['attributes'] - - if (dom['nodeType'] - == RDFParser['nodeType']['TEXT'] - || dom['nodeType'] - == RDFParser['nodeType']['CDATA_SECTION']) {//we have a literal - frame['addLiteral'](dom['nodeValue']) - } - else if (elementURI(dom) - != RDFParser['ns']['RDF']+"RDF") { // not root - if (frame['parent'] && frame['parent']['collection']) { - // we're a collection element - frame['addCollectionArc']() - frame = this['buildFrame'](frame,frame['element']) - frame['parent']['element'] = null - } - if (!frame['parent'] || !frame['parent']['nodeType'] - || frame['parent']['nodeType'] == frame['ARC']) { - // we need a node - var about =this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"about") - var rdfid =this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"ID") - if (about && rdfid) { - throw new Error("RDFParser: " + dom['nodeName'] - + " has both rdf:id and rdf:about." - + " Halting. Only one of these" - + " properties may be specified on a" - + " node."); - } - if (about == null && rdfid) { - frame['addNode']("#"+rdfid['nodeValue']) - dom['removeAttributeNode'](rdfid) - } - else if (about == null && rdfid == null) { - var bnid = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"nodeID") - if (bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { frame['addBNode']() } - } - else { - frame['addNode'](about['nodeValue']) - dom['removeAttributeNode'](about) - } - - // Typed nodes - var rdftype = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"type") - if (RDFParser['ns']['RDF']+"Description" - != elementURI(dom)) { - rdftype = {'nodeValue': elementURI(dom)} - } - if (rdftype != null) { - this['store']['add'](frame['node'], - this['store']['sym']( - RDFParser['ns']['RDF']+"type"), - this['store']['sym']( - $rdf.Util.uri.join( - rdftype['nodeValue'], - frame['base'])), - this['why']) - if (rdftype['nodeName']){ - dom['removeAttributeNode'](rdftype) - } - } - - // Property Attributes - for (var x = attrs['length']-1; x >= 0; x--) { - this['store']['add'](frame['node'], - this['store']['sym']( - elementURI(attrs[x])), - this['store']['literal']( - attrs[x]['nodeValue'], - frame['lang']), - this['why']) - } - } - else { // we should add an arc (or implicit bnode+arc) - frame['addArc'](elementURI(dom)) - - // save the arc's rdf:ID if it has one - if (this['reify']) { - var rdfid = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"ID") - if (rdfid) { - frame['rdfid'] = rdfid['nodeValue'] - dom['removeAttributeNode'](rdfid) - } - } - - var parsetype = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"parseType") - var datatype = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"datatype") - if (datatype) { - frame['datatype'] = datatype['nodeValue'] - dom['removeAttributeNode'](datatype) - } - - if (parsetype) { - var nv = parsetype['nodeValue'] - if (nv == "Literal") { - frame['datatype'] - = RDFParser['ns']['RDF']+"XMLLiteral" - // (this.buildFrame(frame)).addLiteral(dom) - // should work but doesn't - frame = this['buildFrame'](frame) - frame['addLiteral'](dom) - dig = false - } - else if (nv == "Resource") { - frame = this['buildFrame'](frame,frame['element']) - frame['parent']['element'] = null - frame['addBNode']() - } - else if (nv == "Collection") { - frame = this['buildFrame'](frame,frame['element']) - frame['parent']['element'] = null - frame['addCollection']() - } - dom['removeAttributeNode'](parsetype) - } - - if (attrs['length'] != 0) { - var resource = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"resource") - var bnid = this['getAttributeNodeNS'](dom, - RDFParser['ns']['RDF'],"nodeID") - - frame = this['buildFrame'](frame) - if (resource) { - frame['addNode'](resource['nodeValue']) - dom['removeAttributeNode'](resource) - } else { - if (bnid) { - frame['addBNode'](bnid['nodeValue']) - dom['removeAttributeNode'](bnid) - } else { frame['addBNode']() } - } - - for (var x = attrs['length']-1; x >= 0; x--) { - var f = this['buildFrame'](frame) - f['addArc'](elementURI(attrs[x])) - if (elementURI(attrs[x]) - ==RDFParser['ns']['RDF']+"type"){ - (this['buildFrame'](f))['addNode']( - attrs[x]['nodeValue']) - } else { - (this['buildFrame'](f))['addLiteral']( - attrs[x]['nodeValue']) - } - } - } - else if (dom['childNodes']['length'] == 0) { - (this['buildFrame'](frame))['addLiteral']("") - } - } - } // rdf:RDF - - // dig dug - dom = frame['element'] - while (frame['parent']) { - var pframe = frame - while (dom == null) { - frame = frame['parent'] - dom = frame['element'] - } - var candidate = dom['childNodes'][frame['lastChild']] - if (candidate == null || !dig) { - frame['terminateFrame']() - if (!(frame = frame['parent'])) { break } // done - dom = frame['element'] - dig = true - } - else if ((candidate['nodeType'] - != RDFParser['nodeType']['ELEMENT'] - && candidate['nodeType'] - != RDFParser['nodeType']['TEXT'] - && candidate['nodeType'] - != RDFParser['nodeType']['CDATA_SECTION']) - || ((candidate['nodeType'] - == RDFParser['nodeType']['TEXT'] - || candidate['nodeType'] - == RDFParser['nodeType']['CDATA_SECTION']) - && dom['childNodes']['length'] != 1)) { - frame['lastChild']++ - } - else { // not a leaf - frame['lastChild']++ - frame = this['buildFrame'](pframe, - dom['childNodes'][frame['lastChild']-1]) - break - } - } - } // while + } + } // while + } + + /** + * Cleans out state from a previous parse run + * @private + */ + this['cleanParser'] = function () { + this['bnodes'] = {} + this['why'] = null + } + + /** + * Builds scope frame + * @private + */ + this['buildFrame'] = function (parent, element) { + var frame = this['frameFactory'](this, parent, element) + if(parent) { + frame['base'] = parent['base'] + frame['lang'] = parent['lang'] } + if(element == null + || element['nodeType'] == RDFParser['nodeType']['TEXT'] + || element['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { + return frame + } + + var attrs = element['attributes'] - /** - * Cleans out state from a previous parse run - * @private - */ - this['cleanParser'] = function () { - this['bnodes'] = {} - this['why'] = null + var base = element['getAttributeNode']("xml:base") + if(base != null) { + frame['base'] = base['nodeValue'] + element['removeAttribute']("xml:base") + } + var lang = element['getAttributeNode']("xml:lang") + if(lang != null) { + frame['lang'] = lang['nodeValue'] + element['removeAttribute']("xml:lang") } - /** - * Builds scope frame - * @private - */ - this['buildFrame'] = function (parent, element) { - var frame = this['frameFactory'](this,parent,element) - if (parent) { - frame['base'] = parent['base'] - frame['lang'] = parent['lang'] - } - if (element == null - || element['nodeType'] == RDFParser['nodeType']['TEXT'] - || element['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) { - return frame - } - - var attrs = element['attributes'] - - var base = element['getAttributeNode']("xml:base") - if (base != null) { - frame['base'] = base['nodeValue'] - element['removeAttribute']("xml:base") - } - var lang = element['getAttributeNode']("xml:lang") - if (lang != null) { - frame['lang'] = lang['nodeValue'] - element['removeAttribute']("xml:lang") - } - - // remove all extraneous xml and xmlns attributes - for (var x = attrs['length']-1; x >= 0; x--) { - if (attrs[x]['nodeName']['substr'](0,3) == "xml") { - if (attrs[x].name.slice(0,6)=='xmlns:') { - var uri = attrs[x].nodeValue; - // alert('base for namespac attr:'+this.base); - if (this.base) uri = $rdf.Util.uri.join(uri, this.base); - this.store.setPrefixForURI(attrs[x].name.slice(6), - uri); - } -// alert('rdfparser: xml atribute: '+attrs[x].name) //@@ - element['removeAttributeNode'](attrs[x]) - } - } - return frame + // remove all extraneous xml and xmlns attributes + for(var x = attrs['length'] - 1; x >= 0; x--) { + if(attrs[x]['nodeName']['substr'](0, 3) == "xml") { + if(attrs[x].name.slice(0, 6) == 'xmlns:') { + var uri = attrs[x].nodeValue; + // alert('base for namespac attr:'+this.base); + if(this.base) uri = $rdf.Util.uri.join(uri, this.base); + this.store.setPrefixForURI(attrs[x].name.slice(6), uri); + } + // alert('rdfparser: xml atribute: '+attrs[x].name) //@@ + element['removeAttributeNode'](attrs[x]) + } } -} + return frame + } +} +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/serialize.js b/chrome/content/zotero/xpcom/rdf/serialize.js @@ -1,162 +1,167 @@ /* Serialization of RDF Graphs -** -** Tim Berners-Lee 2006 -** This is or was http://dig.csail.mit.edu/2005/ajar/ajaw/js/rdf/serialize.js -** -** Bug: can't serialize http://data.semanticweb.org/person/abraham-bernstein/rdf -** in XML (from mhausenblas) -*/ - + ** + ** Tim Berners-Lee 2006 + ** This is or was http://dig.csail.mit.edu/2005/ajar/ajaw/js/rdf/serialize.js + ** + ** Bug: can't serialize http://data.semanticweb.org/person/abraham-bernstein/rdf + ** in XML (from mhausenblas) + */ // @@@ Check the whole toStr thing tosee whetehr it still makes sense -- tbl // -$rdf.Serializer = function() { +$rdf.Serializer = function () { -var __Serializer = function( store ){ - this.flags = ""; - this.base = null; - this.prefixes = []; - this.keywords = ['a']; // The only one we generate at the moment - this.prefixchars = "abcdefghijklmnopqustuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - this.incoming = null; // Array not calculated yet - this.formulas = []; // remebering original formulae from hashes - this.store = store; + var __Serializer = function (store) { + this.flags = ""; + this.base = null; + this.prefixes = []; + this.keywords = ['a']; // The only one we generate at the moment + this.prefixchars = "abcdefghijklmnopqustuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + this.incoming = null; // Array not calculated yet + this.formulas = []; // remebering original formulae from hashes + this.store = store; - /* pass */ -} + /* pass */ + } -var Serializer = function( store ) {return new __Serializer( store )}; + var Serializer = function (store) { + return new __Serializer(store) + }; -__Serializer.prototype.setBase = function(base) - { this.base = base }; + __Serializer.prototype.setBase = function (base) { + this.base = base + }; -__Serializer.prototype.setFlags = function(flags) - { this.flags = flags?flags: '' }; + __Serializer.prototype.setFlags = function (flags) { + this.flags = flags ? flags : '' + }; -__Serializer.prototype.toStr = function(x) { - var s = x.toNT(); - if (x.termType == 'formula') { - this.formulas[s] = x; // remember as reverse does not work - } - return s; -}; - -__Serializer.prototype.fromStr = function(s) { - if (s[0] == '{') { - var x = this.formulas[s]; - if (!x) alert('No formula object for '+s) - return x; - } - return this.store.fromNT(s); -}; - + __Serializer.prototype.toStr = function (x) { + var s = x.toNT(); + if(x.termType == 'formula') { + this.formulas[s] = x; // remember as reverse does not work + } + return s; + }; + + __Serializer.prototype.fromStr = function (s) { + if(s[0] == '{') { + var x = this.formulas[s]; + if(!x) alert('No formula object for ' + s) + return x; + } + return this.store.fromNT(s); + }; -/* Accumulate Namespaces -** -** These are only hints. If two overlap, only one gets used -** There is therefore no guarantee in general. -*/ -__Serializer.prototype.suggestPrefix = function(prefix, uri) { + /* Accumulate Namespaces + ** + ** These are only hints. If two overlap, only one gets used + ** There is therefore no guarantee in general. + */ + + __Serializer.prototype.suggestPrefix = function (prefix, uri) { this.prefixes[uri] = prefix; -} + } -// Takes a namespace -> prefix map -__Serializer.prototype.suggestNamespaces = function(namespaces) { - for (var px in namespaces) { - this.prefixes[namespaces[px]] = px; + // Takes a namespace -> prefix map + __Serializer.prototype.suggestNamespaces = function (namespaces) { + for(var px in namespaces) { + this.prefixes[namespaces[px]] = px; } -} + } -// Make up an unused prefix for a random namespace -__Serializer.prototype.makeUpPrefix = function(uri) { + // Make up an unused prefix for a random namespace + __Serializer.prototype.makeUpPrefix = function (uri) { var p = uri; var namespaces = []; var pok; var sz = this; - - function canUse(pp) { - if (namespaces[pp]) return false; // already used - sz.prefixes[uri] = pp; - pok = pp; - return true + function canUse(pp) { + if(namespaces[pp]) return false; // already used + sz.prefixes[uri] = pp; + pok = pp; + return true } - for (var ns in sz.prefixes) { - namespaces[sz.prefixes[ns]] = ns; // reverse index + for(var ns in sz.prefixes) { + namespaces[sz.prefixes[ns]] = ns; // reverse index } - if ('#/'.indexOf(p[p.length-1]) >= 0) p = p.slice(0, -1); + if('#/'.indexOf(p[p.length - 1]) >= 0) p = p.slice(0, -1); var slash = p.lastIndexOf('/'); - if (slash >= 0) p = p.slice(slash+1); + if(slash >= 0) p = p.slice(slash + 1); var i = 0; - while (i < p.length) - if (sz.prefixchars.indexOf(p[i])) i++; else break; - p = p.slice(0,i); - if (p.length < 6 && canUse(p)) return pok; // exact i sbest - if (canUse(p.slice(0,3))) return pok; - if (canUse(p.slice(0,2))) return pok; - if (canUse(p.slice(0,4))) return pok; - if (canUse(p.slice(0,1))) return pok; - if (canUse(p.slice(0,5))) return pok; - for (var i=0;; i++) if (canUse(p.slice(0,3)+i)) return pok; -} - - - -// Todo: -// - Sort the statements by subject, pred, object -// - do stuff about the docu first and then (or first) about its primary topic. - -__Serializer.prototype.rootSubjects = function(sts) { + while(i < p.length) + if(sz.prefixchars.indexOf(p[i])) + i++; + else + break; + p = p.slice(0, i); + if(p.length < 6 && canUse(p)) return pok; // exact i sbest + if(canUse(p.slice(0, 3))) return pok; + if(canUse(p.slice(0, 2))) return pok; + if(canUse(p.slice(0, 4))) return pok; + if(canUse(p.slice(0, 1))) return pok; + if(canUse(p.slice(0, 5))) return pok; + for(var i = 0;; i++) if(canUse(p.slice(0, 3) + i)) return pok; + } + + + + // Todo: + // - Sort the statements by subject, pred, object + // - do stuff about the docu first and then (or first) about its primary topic. + __Serializer.prototype.rootSubjects = function (sts) { var incoming = {}; var subjects = {}; var sz = this; var allBnodes = {}; -/* This scan is to find out which nodes will have to be the roots of trees -** in the serialized form. This will be any symbols, and any bnodes -** which hve more or less than one incoming arc, and any bnodes which have -** one incoming arc but it is an uninterrupted loop of such nodes back to itself. -** This should be kept linear time with repect to the number of statements. -** Note it does not use any indexing of the store. -*/ + /* This scan is to find out which nodes will have to be the roots of trees + ** in the serialized form. This will be any symbols, and any bnodes + ** which hve more or less than one incoming arc, and any bnodes which have + ** one incoming arc but it is an uninterrupted loop of such nodes back to itself. + ** This should be kept linear time with repect to the number of statements. + ** Note it does not use any indexing of the store. + */ tabulator.log.debug('serialize.js Find bnodes with only one incoming arc\n') - for (var i = 0; i<sts.length; i++) { - var st = sts[i]; - [ st.subject, st.predicate, st.object].map(function(y){ - if (y.termType =='bnode'){allBnodes[y.toNT()] = true}}); - var x = sts[i].object; - if (!incoming[x]) incoming[x] = []; - incoming[x].push(st.subject) // List of things which will cause this to be printed - var ss = subjects[sz.toStr(st.subject)]; // Statements with this as subject - if (!ss) ss = []; - ss.push(st); - subjects[this.toStr(st.subject)] = ss; // Make hash. @@ too slow for formula? - //$rdf.log.debug(' sz potential subject: '+sts[i].subject) + for(var i = 0; i < sts.length; i++) { + var st = sts[i]; + [st.subject, st.predicate, st.object].map(function (y) { + if(y.termType == 'bnode') { + allBnodes[y.toNT()] = true + } + }); + var x = sts[i].object; + if(!incoming[x]) incoming[x] = []; + incoming[x].push(st.subject) // List of things which will cause this to be printed + var ss = subjects[sz.toStr(st.subject)]; // Statements with this as subject + if(!ss) ss = []; + ss.push(st); + subjects[this.toStr(st.subject)] = ss; // Make hash. @@ too slow for formula? + //$rdf.log.debug(' sz potential subject: '+sts[i].subject) } var roots = []; - for (var xNT in subjects) { - var x = sz.fromStr(xNT); - if ((x.termType != 'bnode') || !incoming[x] || (incoming[x].length != 1)){ - roots.push(x); - //$rdf.log.debug(' sz actual subject -: ' + x) - continue; - } + for(var xNT in subjects) { + var x = sz.fromStr(xNT); + if((x.termType != 'bnode') || !incoming[x] || (incoming[x].length != 1)) { + roots.push(x); + //$rdf.log.debug(' sz actual subject -: ' + x) + continue; + } } this.incoming = incoming; // Keep for serializing @@ Bug for nested formulas - -//////////// New bit for CONNECTED bnode loops:frootshash - -// This scans to see whether the serialization is gpoing to lead to a bnode loop -// and at the same time accumulates a list of all bnodes mentioned. -// This is in fact a cut down N3 serialization -/* + //////////// New bit for CONNECTED bnode loops:frootshash + // This scans to see whether the serialization is gpoing to lead to a bnode loop + // and at the same time accumulates a list of all bnodes mentioned. + // This is in fact a cut down N3 serialization + /* tabulator.log.debug('serialize.js Looking for connected bnode loops\n') for (var i=0; i<sts.length; i++) { // @@TBL // dump('\t'+sts[i]+'\n'); @@ -206,12 +211,12 @@ __Serializer.prototype.rootSubjects = function(sts) { dummyTermToN3(subject, subjects, rootsHash); dummyPropertyTree(subject, subjects, rootsHash); } -*/ +*/ // Now do the scan using existing roots tabulator.log.debug('serialize.js Dummy serialize to check for missing nodes') var rootsHash = {}; - for (var i = 0; i< roots.length; i++) rootsHash[roots[i].toNT()] = true; -/* + for(var i = 0; i < roots.length; i++) rootsHash[roots[i].toNT()] = true; + /* for (var i=0; i<roots.length; i++) { var root = roots[i]; dummySubjectTree(root, subjects, rootsHash); @@ -249,341 +254,340 @@ __Serializer.prototype.rootSubjects = function(sts) { } // dump('Done bnode adjustments.\n') */ - return {'roots':roots, 'subjects':subjects, - 'rootsHash': rootsHash, 'incoming': incoming}; -} - -//////////////////////////////////////////////////////// + return { + 'roots': roots, + 'subjects': subjects, + 'rootsHash': rootsHash, + 'incoming': incoming + }; + } -__Serializer.prototype.toN3 = function(f) { + //////////////////////////////////////////////////////// + __Serializer.prototype.toN3 = function (f) { return this.statementsToN3(f.statements); -} + } -__Serializer.prototype._notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~"; -__Serializer.prototype._notNameChars = - ( __Serializer.prototype._notQNameChars + ":" ) ; + __Serializer.prototype._notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~"; + __Serializer.prototype._notNameChars = (__Serializer.prototype._notQNameChars + ":"); - -__Serializer.prototype.statementsToN3 = function(sts) { + + __Serializer.prototype.statementsToN3 = function (sts) { var indent = 4; var width = 80; var sz = this; var namespaceCounts = []; // which have been used - var predMap = { - 'http://www.w3.org/2002/07/owl#sameAs': '=', - 'http://www.w3.org/2000/10/swap/log#implies': '=>', - 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'a' + 'http://www.w3.org/2002/07/owl#sameAs': '=', + 'http://www.w3.org/2000/10/swap/log#implies': '=>', + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'a' } - - - - ////////////////////////// Arrange the bits of text - var spaces=function(n) { - var s=''; - for(var i=0; i<n; i++) s+=' '; + + + ////////////////////////// Arrange the bits of text + var spaces = function (n) { + var s = ''; + for(var i = 0; i < n; i++) s += ' '; return s - } + } - var treeToLine = function(tree) { + var treeToLine = function (tree) { var str = ''; - for (var i=0; i<tree.length; i++) { - var branch = tree[i]; - var s2 = (typeof branch == 'string') ? branch : treeToLine(branch); - if (i!=0 && s2 != ',' && s2 != ';' && s2 != '.') str += ' '; - str += s2; + for(var i = 0; i < tree.length; i++) { + var branch = tree[i]; + var s2 = (typeof branch == 'string') ? branch : treeToLine(branch); + if(i != 0 && s2 != ',' && s2 != ';' && s2 != '.') str += ' '; + str += s2; } return str; - } - - // Convert a nested tree of lists and strings to a string - var treeToString = function(tree, level) { + } + + // Convert a nested tree of lists and strings to a string + var treeToString = function (tree, level) { var str = ''; var lastLength = 100000; - if (!level) level = 0; - for (var i=0; i<tree.length; i++) { - var branch = tree[i]; - if (typeof branch != 'string') { - var substr = treeToString(branch, level +1); - if ( - substr.length < 10*(width-indent*level) - && substr.indexOf('"""') < 0) {// Don't mess up multiline strings - var line = treeToLine(branch); - if (line.length < (width-indent*level)) { - branch = ' '+line; // @@ Hack: treat as string below - substr = '' - } - } - if (substr) lastLength = 10000; - str += substr; + if(!level) level = 0; + for(var i = 0; i < tree.length; i++) { + var branch = tree[i]; + if(typeof branch != 'string') { + var substr = treeToString(branch, level + 1); + if(substr.length < 10 * (width - indent * level) + && substr.indexOf('"""') < 0) { + // Don't mess up multiline strings + var line = treeToLine(branch); + if(line.length < (width - indent * level)) { + branch = ' ' + line; // @@ Hack: treat as string below + substr = '' + } + } + if(substr) lastLength = 10000; + str += substr; + } + if(typeof branch == 'string') { + if(branch.length == '1' && str.slice(-1) == '\n') { + if(",.;".indexOf(branch) >= 0) { + str = str.slice(0, -1) + branch + '\n'; // slip punct'n on end + lastLength += 1; + continue; + } else if("])}".indexOf(branch) >= 0) { + str = str.slice(0, -1) + ' ' + branch + '\n'; + lastLength += 2; + continue; + } } - if (typeof branch == 'string') { - if (branch.length == '1' && str.slice(-1) == '\n') { - if (",.;".indexOf(branch) >=0) { - str = str.slice(0,-1) + branch + '\n'; // slip punct'n on end - lastLength += 1; - continue; - } else if ("])}".indexOf(branch) >=0) { - str = str.slice(0,-1) + ' ' + branch + '\n'; - lastLength += 2; - continue; - } - } - if (lastLength < (indent*level+4)) { // continue - str = str.slice(0,-1) + ' ' + branch + '\n'; - lastLength += branch.length + 1; - } else { - var line = spaces(indent*level) +branch; - str += line +'\n'; - lastLength = line.length; - } - - } else { // not string + if(lastLength < (indent * level + 4)) { // continue + str = str.slice(0, -1) + ' ' + branch + '\n'; + lastLength += branch.length + 1; + } else { + var line = spaces(indent * level) + branch; + str += line + '\n'; + lastLength = line.length; } + + } else { // not string + } } return str; - }; + }; ////////////////////////////////////////////// Structure for N3 - - + // Convert a set of statements into a nested tree of lists and strings function statementListToTree(statements) { - // print('Statement tree for '+statements.length); - var res = []; - var stats = sz.rootSubjects(statements); - var roots = stats.roots; - var results = [] - for (var i=0; i<roots.length; i++) { - var root = roots[i]; - results.push(subjectTree(root, stats)) - } - return results; + // print('Statement tree for '+statements.length); + var res = []; + var stats = sz.rootSubjects(statements); + var roots = stats.roots; + var results = [] + for(var i = 0; i < roots.length; i++) { + var root = roots[i]; + results.push(subjectTree(root, stats)) + } + return results; } - + // The tree for a subject function subjectTree(subject, stats) { - if (subject.termType == 'bnode' && !stats.incoming[subject]) - return objectTree(subject, stats, true).concat(["."]); // Anonymous bnode subject - return [ termToN3(subject, stats) ].concat([propertyTree(subject, stats)]).concat(["."]); + if(subject.termType == 'bnode' && !stats.incoming[subject]) + return objectTree(subject, stats, true).concat(["."]); // Anonymous bnode subject + return [termToN3(subject, stats)].concat([propertyTree(subject, stats)]).concat(["."]); } - + // The property tree for a single subject or anonymous node function propertyTree(subject, stats) { - // print('Proprty tree for '+subject); - var results = [] - var lastPred = null; - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - if (typeof sts == 'undefined') { - throw('Cant find statements for '+subject); - } - sts.sort(); - var objects = []; - for (var i=0; i<sts.length; i++) { - var st = sts[i]; - if (st.predicate.uri == lastPred) { - objects.push(','); - } else { - if (lastPred) { - results=results.concat([objects]).concat([';']); - objects = []; - } - results.push(predMap[st.predicate.uri] ? - predMap[st.predicate.uri] : termToN3(st.predicate, stats)); - } - lastPred = st.predicate.uri; - objects.push(objectTree(st.object, stats)); + // print('Proprty tree for '+subject); + var results = [] + var lastPred = null; + var sts = stats.subjects[sz.toStr(subject)]; // relevant statements + if(typeof sts == 'undefined') { + throw('Cant find statements for ' + subject); + } + sts.sort(); + var objects = []; + for(var i = 0; i < sts.length; i++) { + var st = sts[i]; + if(st.predicate.uri == lastPred) { + objects.push(','); + } else { + if(lastPred) { + results = results.concat([objects]).concat([';']); + objects = []; + } + results.push(predMap[st.predicate.uri] ? + predMap[st.predicate.uri] : + termToN3(st.predicate, stats)); } - results=results.concat([objects]); - return results; + lastPred = st.predicate.uri; + objects.push(objectTree(st.object, stats)); + } + results = results.concat([objects]); + return results; } function objectTree(obj, stats, force) { - if (obj.termType == 'bnode' && - stats.subjects[sz.toStr(obj)] && // and there are statements - (force || stats.rootsHash[obj.toNT()] == undefined)) // and not a root - return ['['].concat(propertyTree(obj, stats)).concat([']']); - return termToN3(obj, stats); + if(obj.termType == 'bnode' + && stats.subjects[sz.toStr(obj)] + // and there are statements + && (force || stats.rootsHash[obj.toNT()] == undefined)) // and not a root + return ['['].concat(propertyTree(obj, stats)).concat([']']); + return termToN3(obj, stats); } - + function termToN3(expr, stats) { - switch(expr.termType) { - case 'bnode': - case 'variable': return expr.toNT(); - case 'literal': - var str = stringToN3(expr.value); - if (expr.lang) str+= '@' + expr.lang; - if (expr.datatype) str+= '^^' + termToN3(expr.datatype, stats); - return str; - case 'symbol': - return symbolToN3(expr.uri); - case 'formula': - var res = ['{']; - res = res.concat(statementListToTree(expr.statements)); - return res.concat(['}']); - case 'collection': - var res = ['(']; - for (i=0; i<expr.elements.length; i++) { - res.push( [ objectTree(expr.elements[i], stats) ]); - } - res.push(')'); - return res; - - default: - throw "Internal: termToN3 cannot handle "+expr+" of termType+"+expr.termType - return ''+expr; + switch(expr.termType) { + case 'bnode': + case 'variable': + return expr.toNT(); + case 'literal': + var str = stringToN3(expr.value); + if(expr.lang) str += '@' + expr.lang; + if(expr.datatype) str += '^^' + termToN3(expr.datatype, stats); + return str; + case 'symbol': + return symbolToN3(expr.uri); + case 'formula': + var res = ['{']; + res = res.concat(statementListToTree(expr.statements)); + return res.concat(['}']); + case 'collection': + var res = ['(']; + for(i = 0; i < expr.elements.length; i++) { + res.push([objectTree(expr.elements[i], stats)]); } + res.push(')'); + return res; + + default: + throw "Internal: termToN3 cannot handle " + expr + " of termType+" + expr.termType + return '' + expr; + } } - + ////////////////////////////////////////////// Atomic Terms - // Deal with term level things and nesting with no bnode structure - - function symbolToN3(uri) { // c.f. symbolString() in notation3.py - var j = uri.indexOf('#'); - if (j<0 && sz.flags.indexOf('/') < 0) { - j = uri.lastIndexOf('/'); + function symbolToN3(uri) { // c.f. symbolString() in notation3.py + var j = uri.indexOf('#'); + if(j < 0 && sz.flags.indexOf('/') < 0) { + j = uri.lastIndexOf('/'); + } + if(j >= 0 && sz.flags.indexOf('p') < 0) { // Can split at namespace + var canSplit = true; + for(var k = j + 1; k < uri.length; k++) { + if(__Serializer.prototype._notNameChars.indexOf(uri[k]) >= 0) { + canSplit = false; + break; + } } - if (j >= 0 && sz.flags.indexOf('p') < 0) { // Can split at namespace - var canSplit = true; - for (var k=j+1; k<uri.length; k++) { - if (__Serializer.prototype._notNameChars.indexOf(uri[k]) >=0) { - canSplit = false; break; - } - } - if (canSplit) { - var localid = uri.slice(j+1); - var namesp = uri.slice(0,j+1); - if (sz.defaultNamespace && sz.defaultNamespace == namesp - && sz.flags.indexOf('d') < 0) {// d -> suppress default - if (sz.flags.indexOf('k') >= 0 && - sz.keyords.indexOf(localid) <0) - return localid; - return ':' + localid; - } - var prefix = sz.prefixes[namesp]; - if (prefix) { - namespaceCounts[namesp] = true; - return prefix + ':' + localid; - } - if (uri.slice(0, j) == sz.base) - return '<#' + localid + '>'; - // Fall though if can't do qname - } + if(canSplit) { + var localid = uri.slice(j + 1); + var namesp = uri.slice(0, j + 1); + if(sz.defaultNamespace + && sz.defaultNamespace == namesp + && sz.flags.indexOf('d') < 0) { // d -> suppress default + if(sz.flags.indexOf('k') >= 0 + && sz.keyords.indexOf(localid) < 0) + return localid; + return ':' + localid; + } + var prefix = sz.prefixes[namesp]; + if(prefix) { + namespaceCounts[namesp] = true; + return prefix + ':' + localid; + } + if(uri.slice(0, j) == sz.base) + return '<#' + localid + '>'; + // Fall though if can't do qname } - if (sz.flags.indexOf('r') < 0 && sz.base) - uri = $rdf.Util.uri.refTo(sz.base, uri); - else if (sz.flags.indexOf('u') >= 0) - uri = backslashUify(uri); - else uri = hexify(uri); - return '<'+uri+'>'; + } + if(sz.flags.indexOf('r') < 0 && sz.base) + uri = $rdf.Util.uri.refTo(sz.base, uri); + else if(sz.flags.indexOf('u') >= 0) + uri = backslashUify(uri); + else uri = hexify(uri); + return '<' + uri + '>'; } - + function prefixDirectives() { - var str = ''; - if (sz.defaultNamespace) - str += '@prefix : <'+sz.defaultNamespace+'>.\n'; - for (var ns in namespaceCounts) { - str += '@prefix ' + sz.prefixes[ns] + ': <'+ns+'>.\n'; - } - return str + '\n'; + var str = ''; + if(sz.defaultNamespace) + str += '@prefix : <' + sz.defaultNamespace + '>.\n'; + for(var ns in namespaceCounts) { + str += '@prefix ' + sz.prefixes[ns] + ': <' + ns + '>.\n'; + } + return str + '\n'; } - + // stringToN3: String escaping for N3 // var forbidden1 = new RegExp(/[\\"\b\f\r\v\t\n\u0080-\uffff]/gm); var forbidden3 = new RegExp(/[\\"\b\f\r\v\u0080-\uffff]/gm); + function stringToN3(str, flags) { - if (!flags) flags = "e"; - var res = '', i=0, j=0; - var delim; - var forbidden; - if (str.length > 20 // Long enough to make sense - && str.slice(-1) != '"' // corner case' - && flags.indexOf('n') <0 // Force single line - && (str.indexOf('\n') >0 || str.indexOf('"') > 0)) { - delim = '"""'; - forbidden = forbidden3; + if(!flags) flags = "e"; + var res = '', i = 0, j = 0; + var delim; + var forbidden; + if(str.length > 20 // Long enough to make sense + && str.slice(-1) != '"' // corner case' + && flags.indexOf('n') < 0 // Force single line + && (str.indexOf('\n') > 0 || str.indexOf('"') > 0)) { + delim = '"""'; + forbidden = forbidden3; + } else { + delim = '"'; + forbidden = forbidden1; + } + for(i = 0; i < str.length;) { + forbidden.lastIndex = 0; + var m = forbidden.exec(str.slice(i)); + if(m == null) break; + j = i + forbidden.lastIndex - 1; + res += str.slice(i, j); + var ch = str[j]; + if(ch == '"' && delim == '"""' && str.slice(j, j + 3) != '"""') { + res += ch; } else { - delim = '"'; - forbidden = forbidden1; - } - for(i=0; i<str.length;) { - forbidden.lastIndex = 0; - var m = forbidden.exec(str.slice(i)); - if (m == null) break; - j = i + forbidden.lastIndex -1; - res += str.slice(i,j); - var ch = str[j]; - if (ch=='"' && delim == '"""' && str.slice(j,j+3) != '"""') { - res += ch; - } else { - var k = '\b\f\r\t\v\n\\"'.indexOf(ch); // No escaping of bell (7)? - if (k >= 0) { - res += "\\" + 'bfrtvn\\"'[k]; - } else { - if (flags.indexOf('e')>=0) { - res += '\\u' + ('000'+ - ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4) - } else { // no 'e' flag - res += ch; - } - } + var k = '\b\f\r\t\v\n\\"'.indexOf(ch); // No escaping of bell (7)? + if(k >= 0) { + res += "\\" + 'bfrtvn\\"' [k]; + } else { + if(flags.indexOf('e') >= 0) { + res += '\\u' + ('000' + ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4) + } else { // no 'e' flag + res += ch; } - i = j+1; + } } - return delim + res + str.slice(i) + delim + i = j + 1; + } + return delim + res + str.slice(i) + delim } // Body of toN3: - var tree = statementListToTree(sts); return prefixDirectives() + treeToString(tree, -1); - -} -// String ecaping utilities + } -function hexify(str) { // also used in parser -// var res = ''; -// for (var i=0; i<str.length; i++) { -// k = str.charCodeAt(i); -// if (k>126 || k<33) -// res += '%' + ('0'+n.toString(16)).slice(-2); // convert to upper? -// else -// res += str[i]; -// } -// return res; - return encodeURI(str); -} + // String ecaping utilities + function hexify(str) { // also used in parser + // var res = ''; + // for (var i=0; i<str.length; i++) { + // k = str.charCodeAt(i); + // if (k>126 || k<33) + // res += '%' + ('0'+n.toString(16)).slice(-2); // convert to upper? + // else + // res += str[i]; + // } + // return res; + return encodeURI(str); + } -function backslashUify(str) { + function backslashUify(str) { var res = '', k; - for (var i=0; i<str.length; i++) { - k = str.charCodeAt(i); - if (k>65535) - res += '\\U' + ('00000000'+n.toString(16)).slice(-8); // convert to upper? - else if (k>126) - res += '\\u' + ('0000'+n.toString(16)).slice(-4); - else - res += str[i]; + for(var i = 0; i < str.length; i++) { + k = str.charCodeAt(i); + if(k > 65535) + res += '\\U' + ('00000000' + n.toString(16)).slice(-8); // convert to upper? + else if(k > 126) + res += '\\u' + ('0000' + n.toString(16)).slice(-4); + else + res += str[i]; } return res; -} + } -//////////////////////////////////////////////// XML serialization - -__Serializer.prototype.statementsToXML = function(sts) { + //////////////////////////////////////////////// XML serialization + __Serializer.prototype.statementsToXML = function (sts) { var indent = 4; var width = 80; var sz = this; @@ -592,276 +596,273 @@ __Serializer.prototype.statementsToXML = function(sts) { namespaceCounts['http://www.w3.org/1999/02/22-rdf-syntax-ns#'] = true; ////////////////////////// Arrange the bits of XML text - - var spaces=function(n) { - var s=''; - for(var i=0; i<n; i++) s+=' '; + var spaces = function (n) { + var s = ''; + for(var i = 0; i < n; i++) s += ' '; return s - } + } - var XMLtreeToLine = function(tree) { + var XMLtreeToLine = function (tree) { var str = ''; - for (var i=0; i<tree.length; i++) { - var branch = tree[i]; - var s2 = (typeof branch == 'string') ? branch : XMLtreeToLine(branch); - str += s2; + for(var i = 0; i < tree.length; i++) { + var branch = tree[i]; + var s2 = (typeof branch == 'string') ? branch : XMLtreeToLine(branch); + str += s2; } return str; - } - - // Convert a nested tree of lists and strings to a string - var XMLtreeToString = function(tree, level) { + } + + // Convert a nested tree of lists and strings to a string + var XMLtreeToString = function (tree, level) { var str = ''; var lastLength = 100000; - if (!level) level = 0; - for (var i=0; i<tree.length; i++) { - var branch = tree[i]; - if (typeof branch != 'string') { - var substr = XMLtreeToString(branch, level +1); - if ( - substr.length < 10*(width-indent*level) - && substr.indexOf('"""') < 0) {// Don't mess up multiline strings - var line = XMLtreeToLine(branch); - if (line.length < (width-indent*level)) { - branch = ' '+line; // @@ Hack: treat as string below - substr = '' - } - } - if (substr) lastLength = 10000; - str += substr; + if(!level) level = 0; + for(var i = 0; i < tree.length; i++) { + var branch = tree[i]; + if(typeof branch != 'string') { + var substr = XMLtreeToString(branch, level + 1); + if(substr.length < 10 * (width - indent * level) + && substr.indexOf('"""') < 0) { + // Don't mess up multiline strings + var line = XMLtreeToLine(branch); + if(line.length < (width - indent * level)) { + branch = ' ' + line; // @@ Hack: treat as string below + substr = '' + } } - if (typeof branch == 'string') { - if (lastLength < (indent*level+4)) { // continue - str = str.slice(0,-1) + ' ' + branch + '\n'; - lastLength += branch.length + 1; - } else { - var line = spaces(indent*level) +branch; - str += line +'\n'; - lastLength = line.length; - } - - } else { // not string + if(substr) lastLength = 10000; + str += substr; + } + if(typeof branch == 'string') { + if(lastLength < (indent * level + 4)) { // continue + str = str.slice(0, -1) + ' ' + branch + '\n'; + lastLength += branch.length + 1; + } else { + var line = spaces(indent * level) + branch; + str += line + '\n'; + lastLength = line.length; } + + } else { // not string + } } return str; - }; + }; function statementListToXMLTree(statements) { - sz.suggestPrefix('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); - var stats = sz.rootSubjects(statements); - var roots = stats.roots; - var results = [], root; - for (var i=0; i<roots.length; i++) { - root = roots[i]; - results.push(subjectXMLTree(root, stats)) - } - return results; + sz.suggestPrefix('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); + var stats = sz.rootSubjects(statements); + var roots = stats.roots; + var results = [], root; + for(var i = 0; i < roots.length; i++) { + root = roots[i]; + results.push(subjectXMLTree(root, stats)) + } + return results; } - + function escapeForXML(str) { - if (typeof str == 'undefined') return '@@@undefined@@@@'; - return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;'); + if(typeof str == 'undefined') return '@@@undefined@@@@'; + return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;'); } function relURI(term) { - return escapeForXML((sz.base) ? $rdf.Util.uri.refTo(this.base, term.uri) : term.uri); + return escapeForXML((sz.base) ? $rdf.Util.uri.refTo(this.base, term.uri) : term.uri); } // The tree for a subject function subjectXMLTree(subject, stats) { - const liPrefix = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_'; - var results = []; - var type = null, t, st; - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - - // Sort only on the predicate, leave the order at object - // level undisturbed. This leaves multilingual content in - // the order of entry (for partner literals), which helps - // readability. - // - // For the predicate sort, we attempt to split the uri - // as a hint to the sequence, as sequenced items seems - // to be of the form http://example.com#_1, http://example.com#_2, - // et cetera. Probably not the most optimal of fixes, but - // it does work. - sts.sort(function(a,b) { - var aa = a.predicate.uri.split('#_'); - var bb = a.predicate.uri.split('#_'); - if (aa[0] > bb[0]) { - return 1; - } else if (aa[0] < bb[0]) { - return -1; - } else if ("undefined" !== typeof aa[1] && "undefined" !== typeof bb[1]) { - if (parseInt(aa[1], 10) > parseInt(bb[1], 10)) { - return 1; - } else if (parseInt(aa[1], 10) < parseInt(bb[1], 10)) { - return -1; - } - } - return 0; - }); - - for (var i=0; i<sts.length; i++) { - st = sts[i]; - if(st.predicate.uri == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' && !type && st.object.termType == "symbol") { - // look for a type - type = st.object; - } else { - // see whether predicate can be replaced with "li" - if(st.predicate.uri.substr(0, liPrefix.length) == liPrefix) { - var number = st.predicate.uri.substr(liPrefix.length); - // make sure these are actually numeric list items - var intNumber = parseInt(number); - if(number == intNumber.toString()) { - // was numeric; don't need to worry about ordering since we've already - // sorted the statements - st.predicate = $rdf.Symbol('http://www.w3.org/1999/02/22-rdf-syntax-ns#li'); - } - } - t = qname(st.predicate); - switch (st.object.termType) { - case 'bnode': - if(sz.incoming[st.object].length == 1) { - results = results.concat(['<'+ t +'>', - subjectXMLTree(st.object, stats), - '</'+ t +'>']); - } else { - results = results.concat(['<'+ t +' rdf:nodeID="' - +st.object.toNT().slice(2)+'"/>']); - } - break; - case 'symbol': - results = results.concat(['<'+ t +' rdf:resource="' - + relURI(st.object)+'"/>']); - break; - case 'literal': - results = results.concat(['<'+ t - + (st.object.dt ? ' rdf:datatype="'+escapeForXML(st.object.dt.uri)+'"' : '') - + (st.object.lang ? ' xml:lang="'+st.object.lang+'"' : '') - + '>' + escapeForXML(st.object.value) - + '</'+ t +'>']); - break; - case 'collection': - results = results.concat(['<'+ t +' rdf:parseType="Collection">', - collectionXMLTree(st.object, stats), - '</'+ t +'>']); - break; - default: - throw "Can't serialize object of type "+st.object.termType +" into XML"; - } // switch - } - } - - var tag = type ? qname(type) : 'rdf:Description'; - - var attrs = ''; - if (subject.termType == 'bnode') { - if(sz.incoming[subject].length != 1) { // not an anonymous bnode - attrs = ' rdf:nodeID="'+subject.toNT().slice(2)+'"'; - } + const liPrefix = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_'; + var results = []; + var type = null, t, st; + var sts = stats.subjects[sz.toStr(subject)]; // relevant statements + // Sort only on the predicate, leave the order at object + // level undisturbed. This leaves multilingual content in + // the order of entry (for partner literals), which helps + // readability. + // + // For the predicate sort, we attempt to split the uri + // as a hint to the sequence, as sequenced items seems + // to be of the form http://example.com#_1, http://example.com#_2, + // et cetera. Probably not the most optimal of fixes, but + // it does work. + sts.sort(function (a, b) { + var aa = a.predicate.uri.split('#_'); + var bb = a.predicate.uri.split('#_'); + if(aa[0] > bb[0]) { + return 1; + } else if(aa[0] < bb[0]) { + return -1; + } else if("undefined" !== typeof aa[1] && "undefined" !== typeof bb[1]) { + if(parseInt(aa[1], 10) > parseInt(bb[1], 10)) { + return 1; + } else if(parseInt(aa[1], 10) < parseInt(bb[1], 10)) { + return -1; + } + } + return 0; + }); + + for(var i = 0; i < sts.length; i++) { + st = sts[i]; + if(st.predicate.uri == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' && !type && st.object.termType == "symbol") { + // look for a type + type = st.object; } else { - attrs = ' rdf:about="'+ relURI(subject)+'"'; + // see whether predicate can be replaced with "li" + if(st.predicate.uri.substr(0, liPrefix.length) == liPrefix) { + var number = st.predicate.uri.substr(liPrefix.length); + // make sure these are actually numeric list items + var intNumber = parseInt(number); + if(number == intNumber.toString()) { + // was numeric; don't need to worry about ordering since we've already + // sorted the statements + st.predicate = $rdf.Symbol('http://www.w3.org/1999/02/22-rdf-syntax-ns#li'); + } + } + t = qname(st.predicate); + switch(st.object.termType) { + case 'bnode': + if(sz.incoming[st.object].length == 1) { + results = results.concat(['<' + t + '>', + subjectXMLTree(st.object, stats), + '</' + t + '>']); + } else { + results = results.concat(['<' + t + ' rdf:nodeID="' + + st.object.toNT().slice(2) + '"/>']); + } + break; + case 'symbol': + results = results.concat(['<' + t + ' rdf:resource="' + + relURI(st.object) + '"/>']); + break; + case 'literal': + results = results.concat(['<' + t + + (st.object.dt ? ' rdf:datatype="' + escapeForXML(st.object.dt.uri) + '"' : '') + + (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '') + + '>' + escapeForXML(st.object.value) + + '</' + t + '>']); + break; + case 'collection': + results = results.concat(['<' + t + ' rdf:parseType="Collection">', + collectionXMLTree(st.object, stats), + '</' + t + '>']); + break; + default: + throw "Can't serialize object of type " + st.object.termType + " into XML"; + } // switch } + } - return [ '<' + tag + attrs + '>' ].concat([results]).concat(["</"+ tag +">"]); + var tag = type ? qname(type) : 'rdf:Description'; + + var attrs = ''; + if(subject.termType == 'bnode') { + if(sz.incoming[subject].length != 1) { // not an anonymous bnode + attrs = ' rdf:nodeID="' + subject.toNT().slice(2) + '"'; + } + } else { + attrs = ' rdf:about="' + relURI(subject) + '"'; + } + + return ['<' + tag + attrs + '>'].concat([results]).concat(["</" + tag + ">"]); } + function collectionXMLTree(subject, stats) { - var res = [] - for (var i=0; i< subject.elements.length; i++) { - res.push(subjectXMLTree(subject.elements[i], stats)); - } - return res; - } + var res = [] + for(var i = 0; i < subject.elements.length; i++) { + res.push(subjectXMLTree(subject.elements[i], stats)); + } + return res; + } // The property tree for a single subject or anonymos node function propertyXMLTree(subject, stats) { - var results = [] - var sts = stats.subjects[sz.toStr(subject)]; // relevant statements - if (sts == undefined) return results; // No relevant statements - sts.sort(); - for (var i=0; i<sts.length; i++) { - var st = sts[i]; - switch (st.object.termType) { - case 'bnode': - if(stats.rootsHash[st.object.toNT()]) { // This bnode has been done as a root -- no content here @@ what bout first time - results = results.concat(['<'+qname(st.predicate)+' rdf:nodeID="'+st.object.toNT().slice(2)+'">', - '</'+qname(st.predicate)+'>']); - } else { - results = results.concat(['<'+qname(st.predicate)+' rdf:parseType="Resource">', - propertyXMLTree(st.object, stats), - '</'+qname(st.predicate)+'>']); - } - break; - case 'symbol': - results = results.concat(['<'+qname(st.predicate)+' rdf:resource="' - + relURI(st.object)+'"/>']); - break; - case 'literal': - results = results.concat(['<'+qname(st.predicate) - + (st.object.datatype ? ' rdf:datatype="'+escapeForXML(st.object.datatype.uri)+'"' : '') - + (st.object.lang ? ' xml:lang="'+st.object.lang+'"' : '') - + '>' + escapeForXML(st.object.value) - + '</'+qname(st.predicate)+'>']); - break; - case 'collection': - results = results.concat(['<'+qname(st.predicate)+' rdf:parseType="Collection">', - collectionXMLTree(st.object, stats), - '</'+qname(st.predicate)+'>']); - break; - default: - throw "Can't serialize object of type "+st.object.termType +" into XML"; - - } // switch - } - return results; + var results = [] + var sts = stats.subjects[sz.toStr(subject)]; // relevant statements + if(sts == undefined) return results; // No relevant statements + sts.sort(); + for(var i = 0; i < sts.length; i++) { + var st = sts[i]; + switch(st.object.termType) { + case 'bnode': + if(stats.rootsHash[st.object.toNT()]) { // This bnode has been done as a root -- no content here @@ what bout first time + results = results.concat(['<' + qname(st.predicate) + ' rdf:nodeID="' + st.object.toNT().slice(2) + '">', + '</' + qname(st.predicate) + '>']); + } else { + results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Resource">', + propertyXMLTree(st.object, stats), + '</' + qname(st.predicate) + '>']); + } + break; + case 'symbol': + results = results.concat(['<' + qname(st.predicate) + ' rdf:resource="' + + relURI(st.object) + '"/>']); + break; + case 'literal': + results = results.concat(['<' + qname(st.predicate) + + (st.object.datatype ? ' rdf:datatype="' + escapeForXML(st.object.datatype.uri) + '"' : '') + + (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '') + + '>' + escapeForXML(st.object.value) + + '</' + qname(st.predicate) + '>']); + break; + case 'collection': + results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Collection">', + collectionXMLTree(st.object, stats), + '</' + qname(st.predicate) + '>']); + break; + default: + throw "Can't serialize object of type " + st.object.termType + " into XML"; + + } // switch + } + return results; } function qname(term) { - var uri = term.uri; - - var j = uri.indexOf('#'); - if (j<0 && sz.flags.indexOf('/') < 0) { - j = uri.lastIndexOf('/'); + var uri = term.uri; + + var j = uri.indexOf('#'); + if(j < 0 && sz.flags.indexOf('/') < 0) { + j = uri.lastIndexOf('/'); + } + if(j < 0) throw("Cannot make qname out of <" + uri + ">") + + var canSplit = true; + for(var k = j + 1; k < uri.length; k++) { + if(__Serializer.prototype._notNameChars.indexOf(uri[k]) >= 0) { + throw('Invalid character "' + uri[k] + '" cannot be in XML qname for URI: ' + uri); } - if (j < 0) throw ("Cannot make qname out of <"+uri+">") - - var canSplit = true; - for (var k=j+1; k<uri.length; k++) { - if (__Serializer.prototype._notNameChars.indexOf(uri[k]) >=0) { - throw ('Invalid character "'+uri[k] +'" cannot be in XML qname for URI: '+uri); - } - } - var localid = uri.slice(j+1); - var namesp = uri.slice(0,j+1); - if (sz.defaultNamespace && sz.defaultNamespace == namesp - && sz.flags.indexOf('d') < 0) {// d -> suppress default - return localid; - } - var prefix = sz.prefixes[namesp]; - if (!prefix) prefix = sz.makeUpPrefix(namesp); - namespaceCounts[namesp] = true; - return prefix + ':' + localid; -// throw ('No prefix for namespace "'+namesp +'" for XML qname for '+uri+', namespaces: '+sz.prefixes+' sz='+sz); + } + var localid = uri.slice(j + 1); + var namesp = uri.slice(0, j + 1); + if(sz.defaultNamespace + && sz.defaultNamespace == namesp + && sz.flags.indexOf('d') < 0) { // d -> suppress default + return localid; + } + var prefix = sz.prefixes[namesp]; + if(!prefix) prefix = sz.makeUpPrefix(namesp); + namespaceCounts[namesp] = true; + return prefix + ':' + localid; + // throw ('No prefix for namespace "'+namesp +'" for XML qname for '+uri+', namespaces: '+sz.prefixes+' sz='+sz); } // Body of toXML: - var tree = statementListToXMLTree(sts); var str = '<rdf:RDF'; - if (sz.defaultNamespace) - str += ' xmlns="'+escapeForXML(sz.defaultNamespace)+'"'; - for (var ns in namespaceCounts) { - str += '\n xmlns:' + sz.prefixes[ns] + '="'+escapeForXML(ns)+'"'; + if(sz.defaultNamespace) + str += ' xmlns="' + escapeForXML(sz.defaultNamespace) + '"'; + for(var ns in namespaceCounts) { + str += '\n xmlns:' + sz.prefixes[ns] + '="' + escapeForXML(ns) + '"'; } str += '>'; - var tree2 = [str, tree, '</rdf:RDF>']; //@@ namespace declrations + var tree2 = [str, tree, '</rdf:RDF>']; //@@ namespace declrations return XMLtreeToString(tree2, -1); -} // End @@ body - -return Serializer; - -}(); + } // End @@ body + return Serializer; +}(); +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/term.js b/chrome/content/zotero/xpcom/rdf/term.js @@ -7,25 +7,27 @@ // // W3C open source licence 2005. // - // Symbol - -$rdf.Empty = function() { - return this; +$rdf.Empty = function () { + return this; }; $rdf.Empty.prototype.termType = 'empty'; -$rdf.Empty.prototype.toString = function () { return "()" }; +$rdf.Empty.prototype.toString = function () { + return "()" +}; $rdf.Empty.prototype.toNT = $rdf.Empty.prototype.toString; -$rdf.Symbol = function( uri ) { - this.uri = uri; - this.value = uri; // -- why? -tim - return this; +$rdf.Symbol = function (uri) { + this.uri = uri; + this.value = uri; // -- why? -tim + return this; } $rdf.Symbol.prototype.termType = 'symbol'; -$rdf.Symbol.prototype.toString = function () { return ("<" + this.uri + ">"); }; +$rdf.Symbol.prototype.toString = function () { + return("<" + this.uri + ">"); +}; $rdf.Symbol.prototype.toNT = $rdf.Symbol.prototype.toString; // Some precalculated symbols @@ -35,132 +37,131 @@ $rdf.Symbol.prototype.XSDfloat = new $rdf.Symbol('http://www.w3.org/2001/XMLSche $rdf.Symbol.prototype.XSDinteger = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#integer'); $rdf.Symbol.prototype.XSDdateTime = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#dateTime'); $rdf.Symbol.prototype.integer = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#integer'); // Used? - // Blank Node - -if (typeof $rdf.NextId != 'undefined') { - $rdf.log.error('Attempt to re-zero existing blank node id counter at '+$rdf.NextId); +if(typeof $rdf.NextId != 'undefined') { + $rdf.log.error('Attempt to re-zero existing blank node id counter at ' + $rdf.NextId); } else { - $rdf.NextId = 0; // Global genid + $rdf.NextId = 0; // Global genid } $rdf.NTAnonymousNodePrefix = "_:n"; -$rdf.BlankNode = function ( id ) { - /*if (id) +$rdf.BlankNode = function (id) { + /*if (id) this.id = id; else*/ - this.id = $rdf.NextId++ - this.value = id ? id : this.id.toString(); - return this + this.id = $rdf.NextId++; + this.value = id ? id : this.id.toString(); + return this }; $rdf.BlankNode.prototype.termType = 'bnode'; -$rdf.BlankNode.prototype.toNT = function() { - return $rdf.NTAnonymousNodePrefix + this.id +$rdf.BlankNode.prototype.toNT = function () { + return $rdf.NTAnonymousNodePrefix + this.id }; $rdf.BlankNode.prototype.toString = $rdf.BlankNode.prototype.toNT; // Literal - $rdf.Literal = function (value, lang, datatype) { - this.value = value - if (lang == "" || lang == null) this.lang = undefined; - else this.lang = lang; // string - if (datatype == null) this.datatype = undefined; - else this.datatype = datatype; // term - return this; + this.value = value + if(lang == "" || lang == null) this.lang = undefined; + else this.lang = lang; // string + if(datatype == null) this.datatype = undefined; + else this.datatype = datatype; // term + return this; } -$rdf.Literal.prototype.termType = 'literal' -$rdf.Literal.prototype.toString = function() { - return ''+this.value; +$rdf.Literal.prototype.termType = 'literal' +$rdf.Literal.prototype.toString = function () { + return '' + this.value; }; -$rdf.Literal.prototype.toNT = function() { - var str = this.value - if (typeof str != 'string') { - if (typeof str == 'number') return ''+str; - throw Error("Value of RDF literal is not string: "+str) - } - str = str.replace(/\\/g, '\\\\'); // escape backslashes - str = str.replace(/\"/g, '\\"'); // escape quotes - str = str.replace(/\n/g, '\\n'); // escape newlines - str = '"' + str + '"' //'; - - if (this.datatype){ - str = str + '^^' + this.datatype.toNT() - } - if (this.lang) { - str = str + "@" + this.lang; - } - return str; +$rdf.Literal.prototype.toNT = function () { + var str = this.value + if(typeof str != 'string') { + if(typeof str == 'number') return '' + str; + throw Error("Value of RDF literal is not string: " + str) + } + str = str.replace(/\\/g, '\\\\'); // escape backslashes + str = str.replace(/\"/g, '\\"'); // escape quotes + str = str.replace(/\n/g, '\\n'); // escape newlines + str = '"' + str + '"' //'; + if(this.datatype) { + str = str + '^^' + this.datatype.toNT() + } + if(this.lang) { + str = str + "@" + this.lang; + } + return str; }; -$rdf.Collection = function() { - this.id = $rdf.NextId++; // Why need an id? For hashstring. - this.elements = []; - this.closed = false; +$rdf.Collection = function () { + this.id = $rdf.NextId++; // Why need an id? For hashstring. + this.elements = []; + this.closed = false; }; $rdf.Collection.prototype.termType = 'collection'; -$rdf.Collection.prototype.toNT = function() { - return $rdf.NTAnonymousNodePrefix + this.id +$rdf.Collection.prototype.toNT = function () { + return $rdf.NTAnonymousNodePrefix + this.id }; -$rdf.Collection.prototype.toString = function() { - var str='('; - for (var i=0; i<this.elements.length; i++) - str+= this.elements[i] + ' '; - return str + ')'; +$rdf.Collection.prototype.toString = function () { + var str = '('; + for(var i = 0; i < this.elements.length; i++) + str += this.elements[i] + ' '; + return str + ')'; }; $rdf.Collection.prototype.append = function (el) { - this.elements.push(el) + this.elements.push(el) } -$rdf.Collection.prototype.unshift=function(el){ - this.elements.unshift(el); +$rdf.Collection.prototype.unshift = function (el) { + this.elements.unshift(el); } -$rdf.Collection.prototype.shift=function(){ - return this.elements.shift(); +$rdf.Collection.prototype.shift = function () { + return this.elements.shift(); } - + $rdf.Collection.prototype.close = function () { - this.closed = true + this.closed = true } // Convert Javascript representation to RDF term object // -$rdf.term = function(val) { - if (typeof val == 'object') - if (val instanceof Date) { - var d2=function(x) {return(''+(100+x)).slice(1,3)}; // format as just two digits - return new $rdf.Literal( - ''+ val.getUTCFullYear() + '-'+ - d2(val.getUTCMonth()+1) +'-'+d2(val.getUTCDate())+ - 'T'+d2(val.getUTCHours())+':'+d2(val.getUTCMinutes())+ - ':'+d2(val.getUTCSeconds())+'Z', - undefined, $rdf.Symbol.prototype.XSDdateTime); - - } - else if (val instanceof Array) { - var x = new $rdf.Collection(); - for (var i=0; i<val.length; i++) x.append($rdf.term(val[i])); - return x; - } - else return val; - if (typeof val == 'string') return new $rdf.Literal(val); - if (typeof val == 'number') { - var dt; - if ((''+val).indexOf('e')>=0) dt = $rdf.Symbol.prototype.XSDfloat; - else if ((''+val).indexOf('.')>=0) dt = $rdf.Symbol.prototype.XSDdecimal; - else dt = $rdf.Symbol.prototype.XSDinteger; - return new $rdf.Literal(val, undefined, dt); - } - if (typeof val == 'boolean') return new $rdf.Literal(val?"1":"0", undefined, - $rdf.Symbol.prototype.XSDboolean); - if (typeof val == 'undefined') return undefined; - throw ("Can't make term from " + val + " of type " + typeof val); +$rdf.term = function (val) { + if(typeof val == 'object') + if(val instanceof Date) { + var d2 = function (x) { + return('' + (100 + x)).slice(1, 3) + }; // format as just two digits + return new $rdf.Literal('' + val.getUTCFullYear() + '-' + d2(val.getUTCMonth() + 1) + + '-' + d2(val.getUTCDate()) + 'T' + d2(val.getUTCHours()) + ':' + + d2(val.getUTCMinutes()) + ':' + d2(val.getUTCSeconds()) + 'Z', + undefined, + $rdf.Symbol.prototype.XSDdateTime); + + } else if(val instanceof Array) { + var x = new $rdf.Collection(); + for(var i = 0; i < val.length; i++) + x.append($rdf.term(val[i])); + return x; + } else + return val; + if(typeof val == 'string') + return new $rdf.Literal(val); + if(typeof val == 'number') { + var dt; + if(('' + val).indexOf('e') >= 0) dt = $rdf.Symbol.prototype.XSDfloat; + else if(('' + val).indexOf('.') >= 0) dt = $rdf.Symbol.prototype.XSDdecimal; + else dt = $rdf.Symbol.prototype.XSDinteger; + return new $rdf.Literal(val, undefined, dt); + } + if(typeof val == 'boolean') + return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean); + if(typeof val == 'undefined') + return undefined; + throw("Can't make term from " + val + " of type " + typeof val); } // Statement @@ -169,25 +170,22 @@ $rdf.term = function(val) { // // The reason can point to provenece or inference // - -$rdf.Statement = function(subject, predicate, object, why) { - this.subject = $rdf.term(subject) - this.predicate = $rdf.term(predicate) - this.object = $rdf.term(object) - if (typeof why !='undefined') { - this.why = why; - } - return this; +$rdf.Statement = function (subject, predicate, object, why) { + this.subject = $rdf.term(subject) + this.predicate = $rdf.term(predicate) + this.object = $rdf.term(object) + if(typeof why != 'undefined') { + this.why = why; + } + return this; } -$rdf.st= function(subject, predicate, object, why) { - return new $rdf.Statement(subject, predicate, object, why); +$rdf.st = function (subject, predicate, object, why) { + return new $rdf.Statement(subject, predicate, object, why); }; -$rdf.Statement.prototype.toNT = function() { - return (this.subject.toNT() + " " - + this.predicate.toNT() + " " - + this.object.toNT() +" ."); +$rdf.Statement.prototype.toNT = function () { + return (this.subject.toNT() + " " + this.predicate.toNT() + " " + this.object.toNT() + " ."); }; $rdf.Statement.prototype.toString = $rdf.Statement.prototype.toNT; @@ -195,106 +193,110 @@ $rdf.Statement.prototype.toString = $rdf.Statement.prototype.toNT; // Formula // // Set of statements. - -$rdf.Formula = function() { - this.statements = [] - this.constraints = [] - this.initBindings = [] - this.optional = [] - return this; +$rdf.Formula = function () { + this.statements = [] + this.constraints = [] + this.initBindings = [] + this.optional = [] + return this; }; $rdf.Formula.prototype.termType = 'formula'; -$rdf.Formula.prototype.toNT = function() { - return "{" + this.statements.join('\n') + "}" +$rdf.Formula.prototype.toNT = function () { + return "{" + this.statements.join('\n') + "}" }; $rdf.Formula.prototype.toString = $rdf.Formula.prototype.toNT; -$rdf.Formula.prototype.add = function(subj, pred, obj, why) { - this.statements.push(new $rdf.Statement(subj, pred, obj, why)) +$rdf.Formula.prototype.add = function (subj, pred, obj, why) { + this.statements.push(new $rdf.Statement(subj, pred, obj, why)) } // Convenience methods on a formula allow the creation of new RDF terms: - -$rdf.Formula.prototype.sym = function(uri,name) { - if (name != null) { - throw "This feature (kb.sym with 2 args) is removed. Do not assume prefix mappings." - if (!$rdf.ns[uri]) throw 'The prefix "'+uri+'" is not set in the API'; - uri = $rdf.ns[uri] + name - } - return new $rdf.Symbol(uri) +$rdf.Formula.prototype.sym = function (uri, name) { + if(name != null) { + throw "This feature (kb.sym with 2 args) is removed. Do not assume prefix mappings." + if(!$rdf.ns[uri]) throw 'The prefix "' + uri + '" is not set in the API'; + uri = $rdf.ns[uri] + name + } + return new $rdf.Symbol(uri) } -$rdf.sym = function(uri) { return new $rdf.Symbol(uri); }; +$rdf.sym = function (uri) { + return new $rdf.Symbol(uri); +}; -$rdf.Formula.prototype.literal = function(val, lang, dt) { - return new $rdf.Literal(val.toString(), lang, dt) +$rdf.Formula.prototype.literal = function (val, lang, dt) { + return new $rdf.Literal(val.toString(), lang, dt) } $rdf.lit = $rdf.Formula.prototype.literal; -$rdf.Formula.prototype.bnode = function(id) { - return new $rdf.BlankNode(id) +$rdf.Formula.prototype.bnode = function (id) { + return new $rdf.BlankNode(id) } -$rdf.Formula.prototype.formula = function() { - return new $rdf.Formula() +$rdf.Formula.prototype.formula = function () { + return new $rdf.Formula() } $rdf.Formula.prototype.collection = function () { // obsolete - return new $rdf.Collection() + return new $rdf.Collection() } $rdf.Formula.prototype.list = function (values) { - var li = new $rdf.Collection(); - if (values) { - for(var i = 0; i<values.length; i++) { - li.append(values[i]); - } + var li = new $rdf.Collection(); + if(values) { + for(var i = 0; i < values.length; i++) { + li.append(values[i]); } - return li; + } + return li; } /* Variable -** -** Variables are placeholders used in patterns to be matched. -** In cwm they are symbols which are the formula's list of quantified variables. -** In sparl they are not visibily URIs. Here we compromise, by having -** a common special base URI for variables. Their names are uris, -** but the ? nottaion has an implicit base uri of 'varid:' -*/ - -$rdf.Variable = function(rel) { - this.base = "varid:"; // We deem variabe x to be the symbol varid:x - this.uri = $rdf.Util.uri.join(rel, this.base); - return this; + ** + ** Variables are placeholders used in patterns to be matched. + ** In cwm they are symbols which are the formula's list of quantified variables. + ** In sparl they are not visibily URIs. Here we compromise, by having + ** a common special base URI for variables. Their names are uris, + ** but the ? nottaion has an implicit base uri of 'varid:' + */ + +$rdf.Variable = function (rel) { + this.base = "varid:"; // We deem variabe x to be the symbol varid:x + this.uri = $rdf.Util.uri.join(rel, this.base); + return this; } $rdf.Variable.prototype.termType = 'variable'; -$rdf.Variable.prototype.toNT = function() { - if (this.uri.slice(0, this.base.length) == this.base) { - return '?'+ this.uri.slice(this.base.length);} // @@ poor man's refTo - return '?' + this.uri; +$rdf.Variable.prototype.toNT = function () { + if(this.uri.slice(0, this.base.length) == this.base) { + return '?' + this.uri.slice(this.base.length); + } // @@ poor man's refTo + return '?' + this.uri; }; $rdf.Variable.prototype.toString = $rdf.Variable.prototype.toNT; $rdf.Variable.prototype.classOrder = 7; -$rdf.variable = $rdf.Formula.prototype.variable = function(name) { - return new $rdf.Variable(name); +$rdf.variable = $rdf.Formula.prototype.variable = function (name) { + return new $rdf.Variable(name); }; $rdf.Variable.prototype.hashString = $rdf.Variable.prototype.toNT; // The namespace function generator - $rdf.Namespace = function (nsuri) { - return function(ln) { return new $rdf.Symbol(nsuri+(ln===undefined?'':ln)) } + return function (ln) { + return new $rdf.Symbol(nsuri + (ln === undefined ? '' : ln)) + } } -$rdf.Formula.prototype.ns = function(nsuri) { - return function(ln) { return new $rdf.Symbol(nsuri+(ln===undefined?'':ln)) } +$rdf.Formula.prototype.ns = function (nsuri) { + return function (ln) { + return new $rdf.Symbol(nsuri + (ln === undefined ? '' : ln)) + } } @@ -303,43 +305,42 @@ $rdf.Formula.prototype.ns = function(nsuri) { // The bnode bit should not be used on program-external values; designed // for internal work such as storing a bnode id in an HTML attribute. // This will only parse the strings generated by the vaious toNT() methods. - -$rdf.Formula.prototype.fromNT = function(str) { - var len = str.length - var ch = str.slice(0,1) - if (ch == '<') return $rdf.sym(str.slice(1,len-1)) - if (ch == '"') { - var lang = undefined; - var dt = undefined; - var k = str.lastIndexOf('"'); - if (k < len-1) { - if (str[k+1] == '@') lang = str.slice(k+2,len); - else if (str.slice(k+1,k+3) == '^^') dt = $rdf.fromNT(str.slice(k+3,len)); - else throw "Can't convert string from NT: "+str - } - var str = (str.slice(1,k)); - str = str.replace(/\\"/g, '"'); // unescape quotes ' - str = str.replace(/\\n/g, '\n'); // unescape newlines - str = str.replace(/\\\\/g, '\\'); // unescape backslashes - return $rdf.lit(str, lang, dt); +$rdf.Formula.prototype.fromNT = function (str) { + var len = str.length + var ch = str.slice(0, 1) + if(ch == '<') return $rdf.sym(str.slice(1, len - 1)) + if(ch == '"') { + var lang = undefined; + var dt = undefined; + var k = str.lastIndexOf('"'); + if(k < len - 1) { + if(str[k + 1] == '@') lang = str.slice(k + 2, len); + else if(str.slice(k + 1, k + 3) == '^^') dt = $rdf.fromNT(str.slice(k + 3, len)); + else throw "Can't convert string from NT: " + str } - if (ch == '_') { - var x = new $rdf.BlankNode(); - x.id = parseInt(str.slice(3)); - $rdf.NextId-- - return x - } - if (ch == '?') { - var x = new $rdf.Variable(str.slice(1)); - return x; - } - throw "Can't convert from NT: "+str; - + var str = (str.slice(1, k)); + str = str.replace(/\\"/g, '"'); // unescape quotes ' + str = str.replace(/\\n/g, '\n'); // unescape newlines + str = str.replace(/\\\\/g, '\\'); // unescape backslashes + return $rdf.lit(str, lang, dt); + } + if(ch == '_') { + var x = new $rdf.BlankNode(); + x.id = parseInt(str.slice(3)); + $rdf.NextId-- + return x + } + if(ch == '?') { + var x = new $rdf.Variable(str.slice(1)); + return x; + } + throw "Can't convert from NT: " + str; + } $rdf.fromNT = $rdf.Formula.prototype.fromNT; // Not for inexpert user - // Convenience - and more conventional name: +$rdf.graph = function () { + return new $rdf.IndexedFormula(); +}; -$rdf.graph = function(){return new $rdf.IndexedFormula();}; - -// ends +// ends +\ No newline at end of file diff --git a/chrome/content/zotero/xpcom/rdf/uri.js b/chrome/content/zotero/xpcom/rdf/uri.js @@ -11,135 +11,139 @@ // // See also http://www.w3.org/2000/10/swap/uripath.py // - -if (typeof $rdf.Util.uri == "undefined") { $rdf.Util.uri = {}; }; +if(typeof $rdf.Util.uri == "undefined") { + $rdf.Util.uri = {}; +}; $rdf.Util.uri.join = function (given, base) { - // if (typeof $rdf.log.debug != 'undefined') $rdf.log.debug(" URI given="+given+" base="+base) - var baseHash = base.indexOf('#') - if (baseHash > 0) base = base.slice(0, baseHash) - if (given.length==0) return base // before chopping its filename off - if (given.indexOf('#')==0) return base + given - var colon = given.indexOf(':') - if (colon >= 0) return given // Absolute URI form overrides base URI - var baseColon = base.indexOf(':') - if (base == "") return given; - if (baseColon < 0) { - alert("Invalid base: "+ base + ' in join with ' +given); - return given + // if (typeof $rdf.log.debug != 'undefined') $rdf.log.debug(" URI given="+given+" base="+base) + var baseHash = base.indexOf('#') + if(baseHash > 0) base = base.slice(0, baseHash) + if(given.length == 0) return base // before chopping its filename off + if(given.indexOf('#') == 0) return base + given + var colon = given.indexOf(':') + if(colon >= 0) return given // Absolute URI form overrides base URI + var baseColon = base.indexOf(':') + if(base == "") return given; + if(baseColon < 0) { + alert("Invalid base: " + base + ' in join with ' + given); + return given + } + var baseScheme = base.slice(0, baseColon + 1) // eg http: + if(given.indexOf("//") == 0) // Starts with // + return baseScheme + given; + if(base.indexOf('//', baseColon) == baseColon + 1) { // Any hostpart? + var baseSingle = base.indexOf("/", baseColon + 3) + if(baseSingle < 0) { + if(base.length - baseColon - 3 > 0) { + return base + "/" + given + } else { + return baseScheme + given + } } - var baseScheme = base.slice(0,baseColon+1) // eg http: - if (given.indexOf("//") == 0) // Starts with // - return baseScheme + given; - if (base.indexOf('//', baseColon)==baseColon+1) { // Any hostpart? - var baseSingle = base.indexOf("/", baseColon+3) - if (baseSingle < 0) { - if (base.length-baseColon-3 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } - } else { - var baseSingle = base.indexOf("/", baseColon+1) - if (baseSingle < 0) { - if (base.length-baseColon-1 > 0) { - return base + "/" + given - } else { - return baseScheme + given - } - } + } else { + var baseSingle = base.indexOf("/", baseColon + 1) + if(baseSingle < 0) { + if(base.length - baseColon - 1 > 0) { + return base + "/" + given + } else { + return baseScheme + given + } } + } + + if(given.indexOf('/') == 0) // starts with / but not // + return base.slice(0, baseSingle) + given - if (given.indexOf('/') == 0) // starts with / but not // - return base.slice(0, baseSingle) + given - - var path = base.slice(baseSingle) - var lastSlash = path.lastIndexOf("/") - if (lastSlash <0) return baseScheme + given - if ((lastSlash >=0) && (lastSlash < (path.length-1))) - path = path.slice(0, lastSlash+1) // Chop trailing filename from base - - path = path + given - while (path.match(/[^\/]*\/\.\.\//)) // must apply to result of prev - path = path.replace( /[^\/]*\/\.\.\//, '') // ECMAscript spec 7.8.5 - path = path.replace( /\.\//g, '') // spec vague on escaping - path = path.replace( /\/\.$/, '/' ) - return base.slice(0, baseSingle) + path + var path = base.slice(baseSingle) + var lastSlash = path.lastIndexOf("/") + if(lastSlash < 0) return baseScheme + given + if((lastSlash >= 0) + && (lastSlash < (path.length - 1))) + path = path.slice(0, lastSlash + 1) // Chop trailing filename from base + path = path + given + while(path.match(/[^\/]*\/\.\.\//)) // must apply to result of prev + path = path.replace(/[^\/]*\/\.\.\//, '') // ECMAscript spec 7.8.5 + path = path.replace(/\.\//g, '') // spec vague on escaping + path = path.replace(/\/\.$/, '/') + return base.slice(0, baseSingle) + path } -if (typeof tabulator != 'undefined' && tabulator.isExtension) { - $rdf.Util.uri.join2 = function (given, base){ - var tIOService = Components.classes['@mozilla.org/network/io-service;1'] - .getService(Components.interfaces.nsIIOService); +if(typeof tabulator != 'undefined' && tabulator.isExtension) { + $rdf.Util.uri.join2 = function (given, base) { + var tIOService = Components.classes['@mozilla.org/network/io-service;1'] + .getService(Components.interfaces.nsIIOService); - var baseURI = tIOService.newURI(base, null, null); - return tIOService.newURI(baseURI.resolve(given), null, null).spec; - } + var baseURI = tIOService.newURI(base, null, null); + return tIOService.newURI(baseURI.resolve(given), null, null).spec; + } } else - $rdf.Util.uri.join2 = $rdf.Util.uri.join; - + $rdf.Util.uri.join2 = $rdf.Util.uri.join; + // refTo: Make a URI relative to a given base // // based on code in http://www.w3.org/2000/10/swap/uripath.py // $rdf.Util.uri.commonHost = new RegExp("^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$"); -$rdf.Util.uri.hostpart = function(u) { var m = /[^\/]*\/\/([^\/]*)\//.exec(u); return m? m[1]: '' }; +$rdf.Util.uri.hostpart = function (u) { + var m = /[^\/]*\/\/([^\/]*)\//.exec(u); + return m ? m[1] : '' +}; -$rdf.Util.uri.refTo = function(base, uri) { - if (!base) return uri; - if (base == uri) return ""; - var i =0; // How much are they identical? - while (i<uri.length && i < base.length) - if (uri[i] == base[i]) i++; - else break; - if (base.slice(0,i).match($rdf.Util.uri.commonHost)) { - var k = uri.indexOf('//'); - if (k<0) k=-2; // no host - var l = uri.indexOf('/', k+2); // First *single* slash - if (uri.slice(l+1, l+2) != '/' && base.slice(l+1, l+2) != '/' - && uri.slice(0,l) == base.slice(0,l)) // common path to single slash - return uri.slice(l); // but no other common path segments - } - // fragment of base? - if (uri.slice(i, i+1) == '#' && base.length == i) return uri.slice(i); - while (i>0 && uri[i-1] != '/') i--; +$rdf.Util.uri.refTo = function (base, uri) { + if(!base) return uri; + if(base == uri) return ""; + var i = 0; // How much are they identical? + while(i < uri.length && i < base.length) + if(uri[i] == base[i]) i++; + else break; + if(base.slice(0, i).match($rdf.Util.uri.commonHost)) { + var k = uri.indexOf('//'); + if(k < 0) k = -2; // no host + var l = uri.indexOf('/', k + 2); // First *single* slash + if(uri.slice(l + 1, l + 2) != '/' + && base.slice(l + 1, l + 2) != '/' + && uri.slice(0, l) == base.slice(0, l)) + // common path to single slash + return uri.slice(l); // but no other common path segments + } + // fragment of base? + if(uri.slice(i, i + 1) == '#' && base.length == i) return uri.slice(i); + while(i > 0 && uri[i - 1] != '/') i--; - if (i<3) return uri; // No way - if ((base.indexOf('//', i-2) > 0) || uri.indexOf('//', i-2) > 0) - return uri; // an unshared '//' - if (base.indexOf(':', i) >0) return uri; // unshared ':' - var n = 0; - for (var j=i; j<base.length; j++) if (base[j]=='/') n++; - if (n==0 && i < uri.length && uri[i] =='#') return './' + uri.slice(i); - if (n==0 && i == uri.length) return './'; - var str = ''; - for (var j=0; j<n; j++) str+= '../'; - return str + uri.slice(i); + if(i < 3) return uri; // No way + if((base.indexOf('//', i - 2) > 0) + || uri.indexOf('//', i - 2) > 0) + return uri; // an unshared '//' + if(base.indexOf(':', i) > 0) return uri; // unshared ':' + var n = 0; + for(var j = i; j < base.length; j++) if(base[j] == '/') n++; + if(n == 0 && i < uri.length && uri[i] == '#') return './' + uri.slice(i); + if(n == 0 && i == uri.length) return './'; + var str = ''; + for(var j = 0; j < n; j++) str += '../'; + return str + uri.slice(i); } /** returns URI without the frag **/ $rdf.Util.uri.docpart = function (uri) { - var i = uri.indexOf("#") - if (i < 0) return uri - return uri.slice(0,i) -} + var i = uri.indexOf("#") + if(i < 0) return uri + return uri.slice(0, i) +} /** The document in which something a thing defined **/ $rdf.Util.uri.document = function (x) { - return $rdf.sym($rdf.Util.uri.docpart(x.uri)); -} + return $rdf.sym($rdf.Util.uri.docpart(x.uri)); +} /** return the protocol of a uri **/ /** return null if there isn't one **/ $rdf.Util.uri.protocol = function (uri) { - var index = uri.indexOf(':'); - if (index >= 0) - return uri.slice(0, index); - else - return null; + var index = uri.indexOf(':'); + if(index >= 0) return uri.slice(0, index); + else return null; } //protocol - -//ends +//ends +\ No newline at end of file