commit 37427363634cd0c0abdab0d36be7a1239e37c2a9
parent 113a3d8ef289fa565b8342826ec982ecee391570
Author: aurimasv <aurimas.dev@gmail.com>
Date: Thu, 26 Apr 2012 23:56:08 -0500
Use shorthand notation for rdf:type and some other constructs.
Diffstat:
1 file changed, 61 insertions(+), 8 deletions(-)
diff --git a/chrome/content/zotero/xpcom/rdf/serialize.js b/chrome/content/zotero/xpcom/rdf/serialize.js
@@ -669,19 +669,72 @@ __Serializer.prototype.statementsToXML = function(sts) {
// The tree for a subject
function subjectXMLTree(subject, stats) {
- var start
+ 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
+ sts.sort();
+ 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;
+ sts.splice(i,1);
+ i--;
+ continue;
+ } 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':
+ results = results.concat(['<'+ t +'>',
+ subjectXMLTree(st.object, stats),
+ '</'+ t +'>']);
+ 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 (!stats.incoming[subject]) { // anonymous bnode
- var start = '<rdf:Description>';
- } else {
- var start = '<rdf:Description rdf:nodeID="'+subject.toNT().slice(2)+'">';
+ if(sz.incoming[subject].length != 1) { // not an anonymous bnode
+ attrs = ' rdf:ID="'+subject.toNT().slice(2)+'"';
}
} else {
- var start = '<rdf:Description rdf:about="'+ relURI(subject)+'">';
+ attrs = ' rdf:about="'+ relURI(subject)+'"';
}
- return [ start ].concat(
- [propertyXMLTree(subject, stats)]).concat(["</rdf:Description>"]);
+ return [ '<' + tag + attrs + '>' ].concat([results]).concat(["</"+ tag +">"]);
}
function collectionXMLTree(subject, stats) {
var res = []