- added bookmark folder widget to sidebar (it uses the xbel.xml with XSLT! git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@5206 6c8d7289-2bf4-0310-a012-ef5d649a1542pull/1/head
@ -0,0 +1,68 @@
|
||||
.treeview, .treeview ul {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.treeview ul {
|
||||
background-color: white;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.treeview .hitarea {
|
||||
background: url(../img/treeview/treeview-default.gif) -64px -25px no-repeat;
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
margin-left: -16px;
|
||||
float: left;
|
||||
cursor: pointer;
|
||||
}
|
||||
/* fix for IE6 */
|
||||
* html .hitarea {
|
||||
display: inline;
|
||||
float:none;
|
||||
}
|
||||
|
||||
.treeview li {
|
||||
margin: 0;
|
||||
padding: 3px 0pt 3px 16px;
|
||||
}
|
||||
|
||||
.treeview a.selected {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
#treecontrol { margin: 1em 0; display: none; }
|
||||
|
||||
.treeview .hover { color: red; cursor: pointer; }
|
||||
|
||||
.treeview li { background: url(../img/treeview/treeview-default-line.gif) 0 0 no-repeat; }
|
||||
.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
|
||||
|
||||
.treeview .expandable-hitarea { background-position: -80px -3px; }
|
||||
|
||||
.treeview li.last { background-position: 0 -1766px }
|
||||
.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(../img/treeview/treeview-default.gif); }
|
||||
.treeview li.lastCollapsable { background-position: 0 -111px }
|
||||
.treeview li.lastExpandable { background-position: -32px -67px }
|
||||
|
||||
.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }
|
||||
|
||||
.treeview-red li { background-image: url(../img/treeview/treeview-red-line.gif); }
|
||||
.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(../img/treeview/treeview-red.gif); }
|
||||
|
||||
.treeview-black li { background-image: url(../img/treeview/treeview-black-line.gif); }
|
||||
.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(../img/treeview/treeview-black.gif); }
|
||||
|
||||
.treeview-gray li { background-image: url(../img/treeview/treeview-gray-line.gif); }
|
||||
.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(../img/treeview/treeview-gray.gif); }
|
||||
|
||||
.treeview-famfamfam li { background-image: url(../img/treeview/treeview-famfamfam-line.gif); }
|
||||
.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(../img/treeview/treeview-famfamfam.gif); }
|
||||
|
||||
|
||||
.filetree li { padding: 3px 0 2px 16px; }
|
||||
.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
|
||||
.filetree span.folder { background: url(../img/treeview/folder.gif) 0 0 no-repeat; }
|
||||
.filetree li.expandable span.folder { background: url(../img/treeview/folder-closed.gif) 0 0 no-repeat; }
|
||||
.filetree span.file { background: url(../img/treeview/file.gif) 0 0 no-repeat; }
|
After Width: | Height: | Size: 110 B |
After Width: | Height: | Size: 105 B |
After Width: | Height: | Size: 106 B |
After Width: | Height: | Size: 837 B |
After Width: | Height: | Size: 841 B |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 807 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Treeview 1.4 - jQuery plugin to hide and show branches of a tree
|
||||
*
|
||||
* http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
|
||||
* http://docs.jquery.com/Plugins/Treeview
|
||||
*
|
||||
* Copyright (c) 2007 Jörn Zaefferer
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
|
||||
*
|
||||
*/;(function($){$.extend($.fn,{swapClass:function(c1,c2){var c1Elements=this.filter('.'+c1);this.filter('.'+c2).removeClass(c2).addClass(c1);c1Elements.removeClass(c1).addClass(c2);return this;},replaceClass:function(c1,c2){return this.filter('.'+c1).removeClass(c1).addClass(c2).end();},hoverClass:function(className){className=className||"hover";return this.hover(function(){$(this).addClass(className);},function(){$(this).removeClass(className);});},heightToggle:function(animated,callback){animated?this.animate({height:"toggle"},animated,callback):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();if(callback)callback.apply(this,arguments);});},heightHide:function(animated,callback){if(animated){this.animate({height:"hide"},animated,callback);}else{this.hide();if(callback)this.each(callback);}},prepareBranches:function(settings){if(!settings.prerendered){this.filter(":last-child:not(ul)").addClass(CLASSES.last);this.filter((settings.collapsed?"":"."+CLASSES.closed)+":not(."+CLASSES.open+")").find(">ul").hide();}return this.filter(":has(>ul)");},applyClasses:function(settings,toggler){this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event){toggler.apply($(this).next());}).add($("a",this)).hoverClass();if(!settings.prerendered){this.filter(":has(>ul:hidden)").addClass(CLASSES.expandable).replaceClass(CLASSES.last,CLASSES.lastExpandable);this.not(":has(>ul:hidden)").addClass(CLASSES.collapsable).replaceClass(CLASSES.last,CLASSES.lastCollapsable);this.prepend("<div class=\""+CLASSES.hitarea+"\"/>").find("div."+CLASSES.hitarea).each(function(){var classes="";$.each($(this).parent().attr("class").split(" "),function(){classes+=this+"-hitarea ";});$(this).addClass(classes);});}this.find("div."+CLASSES.hitarea).click(toggler);},treeview:function(settings){settings=$.extend({cookieId:"treeview"},settings);if(settings.add){return this.trigger("add",[settings.add]);}if(settings.toggle){var callback=settings.toggle;settings.toggle=function(){return callback.apply($(this).parent()[0],arguments);};}function treeController(tree,control){function handler(filter){return function(){toggler.apply($("div."+CLASSES.hitarea,tree).filter(function(){return filter?$(this).parent("."+filter).length:true;}));return false;};}$("a:eq(0)",control).click(handler(CLASSES.collapsable));$("a:eq(1)",control).click(handler(CLASSES.expandable));$("a:eq(2)",control).click(handler());}function toggler(){$(this).parent().find(">.hitarea").swapClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).swapClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().swapClass(CLASSES.collapsable,CLASSES.expandable).swapClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightToggle(settings.animated,settings.toggle);if(settings.unique){$(this).parent().siblings().find(">.hitarea").replaceClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).replaceClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().replaceClass(CLASSES.collapsable,CLASSES.expandable).replaceClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightHide(settings.animated,settings.toggle);}}function serialize(){function binary(arg){return arg?1:0;}var data=[];branches.each(function(i,e){data[i]=$(e).is(":has(>ul:visible)")?1:0;});$.cookie(settings.cookieId,data.join(""));}function deserialize(){var stored=$.cookie(settings.cookieId);if(stored){var data=stored.split("");branches.each(function(i,e){$(e).find(">ul")[parseInt(data[i])?"show":"hide"]();});}}this.addClass("treeview");var branches=this.find("li").prepareBranches(settings);switch(settings.persist){case"cookie":var toggleCallback=settings.toggle;settings.toggle=function(){serialize();if(toggleCallback){toggleCallback.apply(this,arguments);}};deserialize();break;case"location":var current=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase();});if(current.length){current.addClass("selected").parents("ul, li").add(current.next()).show();}break;}branches.applyClasses(settings,toggler);if(settings.control){treeController(this,settings.control);$(settings.control).show();}return this.bind("add",function(event,branches){$(branches).prev().removeClass(CLASSES.last).removeClass(CLASSES.lastCollapsable).removeClass(CLASSES.lastExpandable).find(">.hitarea").removeClass(CLASSES.lastCollapsableHitarea).removeClass(CLASSES.lastExpandableHitarea);$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings,toggler);});}});var CLASSES=$.fn.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"};$.fn.Treeview=$.fn.treeview;})(jQuery);
|
@ -0,0 +1,420 @@
|
||||
/**
|
||||
* xslTransform
|
||||
* Tools for XSLT transformations; jQuery wrapper for Sarissa <http://sarissa.sourceforge.net/>.
|
||||
* See jQuery.fn.log below for documentation on $.log().
|
||||
* See jQuery.fn.getTransform below for documention on the $.getTransform().
|
||||
* See var DEBUG below for turning debugging/logging on and off.
|
||||
*
|
||||
* @version 20071214
|
||||
* @since 2006-07-05
|
||||
* @copyright Copyright (c) 2006 Glyphix Studio, Inc. http://www.glyphix.com
|
||||
* @author Brad Brizendine <brizbane@gmail.com>, Matt Antone <antone@glyphix.com>
|
||||
* @license MIT http://www.opensource.org/licenses/mit-license.php
|
||||
* @requires >= jQuery 1.0.3 http://jquery.com/
|
||||
* @requires jquery.debug.js http://jquery.glyphix.com/
|
||||
* @requires >= sarissa.js 0.9.7.6 http://sarissa.sourceforge.net/
|
||||
*
|
||||
* @example
|
||||
* var r = $.xsl.transform('path-to-xsl.xsl','path-to-xml.xml');
|
||||
* @desc Perform a transformation and place the results in var r
|
||||
*
|
||||
* @example
|
||||
* var r = $.xsl.transform('path-to-xsl.xsl','path-to-xml.xml');
|
||||
* var str = $.xsl.serialize( r );
|
||||
* @desc Perform a transformation, then turn the result into a string
|
||||
*
|
||||
* @example
|
||||
* var doc = $.xsl.load('path-to-xml.xml');
|
||||
* @desc Load an xml file and return a parsed xml object
|
||||
*
|
||||
* @example
|
||||
* var xml = '<xmldoc><foo>bar</foo></xmldoc>';
|
||||
* var doc = $.xsl.load(xml);
|
||||
* @desc Load an xml string and return a parsed xml object
|
||||
*/
|
||||
|
||||
(function($){
|
||||
|
||||
/*
|
||||
* JQuery XSLT transformation plugin.
|
||||
* Replaces all matched elements with the results of an XSLT transformation.
|
||||
* See xslTransform above for more documentation.
|
||||
*
|
||||
* @example
|
||||
* @desc See the xslTransform-example/index.html
|
||||
*
|
||||
* @param xsl String the url to the xsl file
|
||||
* @param xml String the url to the xml file
|
||||
* @param options Object various switches you can send to this function
|
||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
||||
* + xpath: defines the root node within the provided xml file
|
||||
* + eval: if true, will attempt to eval javascript found in the transformed result
|
||||
* + callback: if a Function, evaluate it when transformation is complete
|
||||
* @returns
|
||||
*/
|
||||
$.fn.getTransform = function( xsl, xml, options ){
|
||||
var settings = {
|
||||
params: {}, // object of key/value pairs ... parameters to send to the XSL stylesheet
|
||||
xpath: '', // xpath, used to send only a portion of the XML file to the XSL stylesheet
|
||||
eval: true, // evaluate <script> blocks found in the transformed result
|
||||
callback: '' // callback function, to be run on completion of the transformation
|
||||
};
|
||||
// initialize options hash; override the defaults with supplied options
|
||||
$.extend( settings, options );
|
||||
$.log( 'getTransform: ' + xsl + '::' + xml + '::' + settings.toString() );
|
||||
|
||||
// must have both xsl and xml
|
||||
if( !xsl || !xml ){
|
||||
$.log( 'getTransform: missing xsl or xml' );
|
||||
return;
|
||||
}
|
||||
|
||||
// run the jquery magic on all matched elements
|
||||
return this.each( function(){
|
||||
// perform the transformation
|
||||
var trans = $.xsl.transform( xsl, xml, settings );
|
||||
|
||||
// make sure we have something
|
||||
if( !trans.string ){
|
||||
$.log('Received nothing from the transformation');
|
||||
return false;
|
||||
}
|
||||
|
||||
// ie can fail if there's an xml declaration line in the returned result
|
||||
var re = trans.string.match(/<\?xml.*?\?>/);
|
||||
if( re ){
|
||||
trans.string = trans.string.replace( re, '' );
|
||||
$.log( 'getTransform(): found an xml declaration and removed it' );
|
||||
}
|
||||
|
||||
// place the result in the element
|
||||
// 20070202: jquery 1.1.1 can get a "a.appendChild is not a function" error using html() sometimes ...
|
||||
// no idea why yet, so adding a fallback to innerHTML
|
||||
// ::warning:: ie6 has trouble with javascript events such as onclick assigned statically within the html when using innerHTML
|
||||
try{
|
||||
$(this).html( trans.string );
|
||||
}catch(e){
|
||||
$.log( 'getTransform: error placing results of transform into element, falling back to innerHTML: ' + e.toString() );
|
||||
$(this)[0].innerHTML = trans.string;
|
||||
}
|
||||
|
||||
// there might not be a scripts property
|
||||
if( settings.eval && trans.scripts ){
|
||||
if( trans.scripts.length > 0 ){
|
||||
$.log( 'Found text/javascript in transformed result' );
|
||||
// use jquery's globaleval to avoid security issues in adobe air
|
||||
$.globalEval( trans.scripts );
|
||||
}
|
||||
}
|
||||
|
||||
// run the callback if it's a native function
|
||||
if( settings.callback && $.isFunction(settings.callback) ){
|
||||
settings.callback.apply();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// xsl scope
|
||||
$.xsl = {
|
||||
|
||||
// version
|
||||
version: 20071214,
|
||||
|
||||
// init ... test for requirements
|
||||
init: function(){
|
||||
// check for v1.0.4 / v1.1 or later of jQuery
|
||||
try{
|
||||
parseFloat($.fn.jquery) >= 1;
|
||||
}catch(e){
|
||||
alert('xslTransform requires jQuery 1.0.4 or greater ... please load it prior to xslTransform');
|
||||
}
|
||||
// check for Sarissa
|
||||
try{
|
||||
Sarissa;
|
||||
}catch(e){
|
||||
alert('Missing Sarissa ... please load it prior to xslTransform');
|
||||
}
|
||||
// if no log function, create a blank one
|
||||
if( !$.log ){
|
||||
$.log = function(){};
|
||||
$.fn.debug = function(){};
|
||||
}
|
||||
// log the version
|
||||
$.log( 'xslTransform:init(): version ' + this.version );
|
||||
},
|
||||
|
||||
// initialize Sarissa's serializer
|
||||
XMLSerializer: new XMLSerializer(),
|
||||
|
||||
/*
|
||||
* serialize
|
||||
* Turns the provided object into a string and returns it.
|
||||
*
|
||||
* @param data Mixed
|
||||
* @returns String
|
||||
*/
|
||||
serialize: function( data ){
|
||||
$.log( 'serialize(): received ' + typeof(data) );
|
||||
// if it's already a string, no further processing required
|
||||
if( typeof(data) == 'string' ){
|
||||
$.log( 'data is already a string: ' + data );
|
||||
return data;
|
||||
}
|
||||
return this.XMLSerializer.serializeToString( data );
|
||||
},
|
||||
|
||||
/*
|
||||
* xmlize
|
||||
* Turns the provided javascript object into an xml document and returns it.
|
||||
*
|
||||
* @param data Mixed
|
||||
* @returns String
|
||||
*/
|
||||
xmlize: function( data, root ){
|
||||
$.log( 'xmlize(): received ' + typeof(data) );
|
||||
root = root || 'root';
|
||||
return Sarissa.xmlize(data,root);
|
||||
},
|
||||
|
||||
/*
|
||||
* load
|
||||
* Attempts to load xml data by automatically sensing the type of the provided data.
|
||||
*
|
||||
* @param xml Mixed the xml data
|
||||
* @returns Object
|
||||
*/
|
||||
load: function( xml ){
|
||||
$.log( 'load(): received ' + typeof(xml) );
|
||||
// the result
|
||||
var r;
|
||||
|
||||
// if it's an object, assume it's already an XML object, so just return it
|
||||
if( typeof(xml) == 'object' ){
|
||||
return xml;
|
||||
}
|
||||
|
||||
// if it's a string, determine if it's xml data or a path
|
||||
// assume that the first character is an opening caret if it's XML data
|
||||
if( xml.substring(0,1) == '<' ){
|
||||
r = this.loadString( xml );
|
||||
}else{
|
||||
r = this.loadFile( xml );
|
||||
}
|
||||
|
||||
if( r ){
|
||||
// the following two lines are needed to get IE (msxml3) to run xpath ... set it on all xml data
|
||||
r.setProperty( 'SelectionNamespaces', 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' );
|
||||
r.setProperty( 'SelectionLanguage', 'XPath' );
|
||||
return r;
|
||||
}else{
|
||||
$.log( 'Unable to load ' + xml );
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* loadString
|
||||
* Parses an XML string and returns the result.
|
||||
*
|
||||
* @param str String the xml string to turn into a parsed XML object
|
||||
* @returns Object
|
||||
*/
|
||||
loadString: function( str ){
|
||||
$.log( 'loadString(): ' + str + '::' + typeof(str) );
|
||||
|
||||
// use Sarissa to generate an XML doc
|
||||
var p = new DOMParser();
|
||||
var xml = p.parseFromString( str, 'text/xml' );
|
||||
if( !xml ){
|
||||
$.log( 'loadString(): parseFromString() failed' );
|
||||
return false;
|
||||
}
|
||||
return xml;
|
||||
},
|
||||
|
||||
/*
|
||||
* loadFile
|
||||
* Attempts to retrieve the requested path, specified by url.
|
||||
* If url is an object, it's assumed it's already loaded, and just returns it.
|
||||
*
|
||||
* @param url Mixed
|
||||
* @returns Object
|
||||
*/
|
||||
loadFile: function( url ){
|
||||
$.log( 'loadFile(): ' + url + '::' + typeof(url) );
|
||||
|
||||
if( !url ){
|
||||
$.log( 'ERROR: loadFile() missing url' );
|
||||
return false;
|
||||
}
|
||||
|
||||
// variable to hold ajax results
|
||||
var doc;
|
||||
/* ajax functionality provided by jQuery is commented, since it can't handle file:///
|
||||
// function to receive data on successful download ... semicolon after brace is necessary for packing
|
||||
this.xhrsuccess = function(data,str){
|
||||
$.log( 'loadFile() completed successfully (' + str + ')' );
|
||||
doc = data;
|
||||
return true;
|
||||
};
|
||||
// function to handle downloading error ... semicolon after brace is necessary for packing
|
||||
this.xhrerror = function(xhr,err){
|
||||
// set debugging to true in order to force the display of this error
|
||||
window.DEBUG = true;
|
||||
$.log( 'loadFile() failed to load the requested file: (' + err + ') - xml: ' + xhr.responseXML + ' - text: ' + xhr.responseText );
|
||||
doc = null;
|
||||
return false;
|
||||
};
|
||||
|
||||
// make asynchronous ajax call and call functions defined above on success/error
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: url,
|
||||
async: false,
|
||||
success: this.xhrsuccess,
|
||||
error: this.xhrerror
|
||||
});
|
||||
*/
|
||||
|
||||
var xmlhttp = new XMLHttpRequest();
|
||||
xmlhttp.open('GET', url, false);
|
||||
xmlhttp.send('');
|
||||
doc = xmlhttp.responseXML;
|
||||
|
||||
// check for total failure
|
||||
if( !doc ){
|
||||
$.log( 'ERROR: document ' + url + ' not found (404), or unable to load' );
|
||||
return false;
|
||||
}
|
||||
// check for success but no data
|
||||
if( doc.length == 0 ){
|
||||
$.log( 'ERROR: document ' + url + ' loaded in loadFile() has no data' );
|
||||
return false;
|
||||
}
|
||||
return doc;
|
||||
},
|
||||
|
||||
/*
|
||||
* transform
|
||||
* Central transformation function: takes an xml doc and an xsl doc.
|
||||
*
|
||||
* @param xsl Mixed the xsl transformation document
|
||||
* @param xml Mixed the xml document to be transformed
|
||||
* @param options Object various switches you can send to this function
|
||||
* + params: an object of key/value pairs to be sent to xsl as parameters
|
||||
* + xpath: defines the root node within the provided xml file
|
||||
* @returns Object the results of the transformation
|
||||
* + xsl: the raw xsl doc
|
||||
* + doc: the raw results of the transform
|
||||
* + string: the serialized doc
|
||||
*/
|
||||
transform: function( xsl, xml, options ){
|
||||
$.log( 'transform(): ' + xsl + '::' + xml + '::' + (options ? options.toString() : 'no options provided') );
|
||||
|
||||
// set up request and result
|
||||
var request = {
|
||||
// the source and loaded object for xml
|
||||
xsl: {
|
||||
source: xsl,
|
||||
doc: null
|
||||
},
|
||||
// the source and loaded object for xsl
|
||||
xml: {
|
||||
source: xml,
|
||||
doc: null
|
||||
},
|
||||
// the options
|
||||
options: options || {},
|
||||
// the result doc and string
|
||||
result: {
|
||||
doc: null,
|
||||
string: '',
|
||||
scripts: null,
|
||||
error: ''
|
||||
}
|
||||
}
|
||||
|
||||
// set up error handler
|
||||
var err = function( what ){
|
||||
var docerr = '', srcerr = '';
|
||||
// build the src error string
|
||||
srcerr = (typeof(request[what].source) == 'string') ? ' (' + what + ' loaded from provided path)' : ' (' + what + ' loaded from provided object)';
|
||||
// build the text error string
|
||||
docerr = (typeof(request[what].doc) == 'object') ? '[success]' : '[failure]';
|
||||
// include the root node if we have a doc object and it's xml
|
||||
if( what == 'xml' && typeof(request[what].doc) == 'object' ){
|
||||
docerr += ' root node of "' + request[what].doc.getElementsByTagName('*')[0].nodeName + '"';
|
||||
}
|
||||
return docerr + ' ' + srcerr;
|
||||
}
|
||||
|
||||
// load the files
|
||||
try{
|
||||
request.xsl.doc = this.load(xsl);
|
||||
request.xml.doc = this.load(xml);
|
||||
}catch(e){
|
||||
$.log('Unable to load either xsl [' + err('xsl') + '] or xml [' + err('xml') + ']');
|
||||
throw( err('xsl') + '::' + err('xml') );
|
||||
return false;
|
||||
}
|
||||
|
||||
// if we have an xpath, replace xml.doc with the results of running it
|
||||
// as of 2007-12-03, IE throws a "msxml6: the parameter is incorrect" error, so removing this
|
||||
if( request.options.xpath && request.xml.doc && !jQuery.browser.msie ){
|
||||
// run the xpath
|
||||
request.xml.doc = request.xml.doc.selectSingleNode( request.options.xpath.toString() );
|
||||
$.log( 'transform(): xpath has been run...resulting doc: ' + (this.serialize(request.xml.doc)) );
|
||||
}
|
||||
|
||||
// attach the processor
|
||||
var processor = new XSLTProcessor();
|
||||
// stylesheet must be imported before parameters can be added
|
||||
processor.importStylesheet( request.xsl.doc );
|
||||
// add parameters to the processor
|
||||
if( request.options.params && processor ){
|
||||
$.log( 'transform(): received xsl params: ' + request.options.params.toString() );
|
||||
for( key in request.options.params ){
|
||||
// name and value must be strings; first parameter is namespace
|
||||
var p = request.options.params[key] ? request.options.params[key].toString() : request.options.params[key];
|
||||
try{
|
||||
processor.setParameter( null, key.toString(), p );
|
||||
}catch(e){
|
||||
$.log('Unable to set parameter "' + key + '"');
|
||||
return false;
|
||||
}
|
||||
$.log( 'set parameter "' + key.toString() + '" to "' + p + '"' );
|
||||
}
|
||||
}
|
||||
|
||||
// perform the transformation
|
||||
try{
|
||||
request.result.doc = processor.transformToDocument( request.xml.doc );
|
||||
// handle transform error
|
||||
request.result.error = Sarissa.getParseErrorText( request.result.doc );
|
||||
if( request.result.error != Sarissa.PARSED_OK ){
|
||||
// throw the error text
|
||||
request.result.error = 'transform(): error in transformation: ' + request.result.error + ' :: using xsl: ' + err('xsl') + ' => xml: ' + err('xml');
|
||||
$.log(request.result.error);
|
||||
}
|
||||
}catch(e){
|
||||
request.result.error = 'Unable to perform transformation :: using xsl: ' + err('xsl') + ' => xml: ' + err('xml');
|
||||
$.log(request.result.error);
|
||||
throw(request.result.error);
|
||||
return request.result;
|
||||
}
|
||||
|
||||
// if we made it this far, the transformation was successful
|
||||
request.result.string = this.serialize( request.result.doc );
|
||||
// store reference to all scripts found in the doc (not result.string)
|
||||
request.result.scripts = jQuery('script',request.result.doc).text();
|
||||
|
||||
return request.result;
|
||||
}
|
||||
};
|
||||
|
||||
// initialize the $.xsl object
|
||||
$.xsl.init();
|
||||
|
||||
})(jQuery);
|
@ -0,0 +1,220 @@
|
||||
/**
|
||||
* ====================================================================
|
||||
* About
|
||||
* ====================================================================
|
||||
* Sarissa cross browser XML library - IE XPath Emulation
|
||||
* @version 0.9.9.4
|
||||
* @author: Copyright 2004-2007 Emmanouil Batsis, mailto: mbatsis at users full stop sourceforge full stop net
|
||||
*
|
||||
* This script emulates Internet Explorer's selectNodes and selectSingleNode
|
||||
* for Mozilla. Associating namespace prefixes with URIs for your XPath queries
|
||||
* is easy with IE's setProperty.
|
||||
* USers may also map a namespace prefix to a default (unprefixed) namespace in the
|
||||
* source document with Sarissa.setXpathNamespaces
|
||||
*
|
||||
* ====================================================================
|
||||
* Licence
|
||||
* ====================================================================
|
||||
* Sarissa is free software distributed under the GNU GPL version 2 (see <a href="gpl.txt">gpl.txt</a>) or higher,
|
||||
* GNU LGPL version 2.1 (see <a href="lgpl.txt">lgpl.txt</a>) or higher and Apache Software License 2.0 or higher
|
||||
* (see <a href="asl.txt">asl.txt</a>). This means you can choose one of the three and use that if you like. If
|
||||
* you make modifications under the ASL, i would appreciate it if you submitted those.
|
||||
* In case your copy of Sarissa does not include the license texts, you may find
|
||||
* them online in various formats at <a href="http://www.gnu.org">http://www.gnu.org</a> and
|
||||
* <a href="http://www.apache.org">http://www.apache.org</a>.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||
* KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE
|
||||
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
if(Sarissa._SARISSA_HAS_DOM_FEATURE && document.implementation.hasFeature("XPath", "3.0")){
|
||||
/**
|
||||
* <p>SarissaNodeList behaves as a NodeList but is only used as a result to <code>selectNodes</code>,
|
||||
* so it also has some properties IEs proprietery object features.</p>
|
||||
* @private
|
||||
* @constructor
|
||||
* @argument i the (initial) list size
|
||||
*/
|
||||
SarissaNodeList = function (i){
|
||||
this.length = i;
|
||||
};
|
||||
/**
|
||||
* <p>Set an Array as the prototype object</p>
|
||||
* @private
|
||||
*/
|
||||
SarissaNodeList.prototype = [];
|
||||
/**
|
||||
* <p>Inherit the Array constructor </p>
|
||||
* @private
|
||||
*/
|
||||
SarissaNodeList.prototype.constructor = Array;
|
||||
/**
|
||||
* <p>Returns the node at the specified index or null if the given index
|
||||
* is greater than the list size or less than zero </p>
|
||||
* <p><b>Note</b> that in ECMAScript you can also use the square-bracket
|
||||
* array notation instead of calling <code>item</code>
|
||||
* @argument i the index of the member to return
|
||||
* @returns the member corresponding to the given index
|
||||
* @private
|
||||
*/
|
||||
SarissaNodeList.prototype.item = function(i) {
|
||||
return (i < 0 || i >= this.length)?null:this[i];
|
||||
};
|
||||
/**
|
||||
* <p>Emulate IE's expr property
|
||||
* (Here the SarissaNodeList object is given as the result of selectNodes).</p>
|
||||
* @returns the XPath expression passed to selectNodes that resulted in
|
||||
* this SarissaNodeList
|
||||
* @private
|
||||
*/
|
||||
SarissaNodeList.prototype.expr = "";
|
||||
/** dummy, used to accept IE's stuff without throwing errors */
|
||||
if(window.XMLDocument && (!XMLDocument.prototype.setProperty)){
|
||||
XMLDocument.prototype.setProperty = function(x,y){};
|
||||
}
|
||||
/**
|
||||
* <p>Programmatically control namespace URI/prefix mappings for XPath
|
||||
* queries.</p>
|
||||
* <p>This method comes especially handy when used to apply XPath queries
|
||||
* on XML documents with a default namespace, as there is no other way
|
||||
* of mapping that to a prefix.</p>
|
||||
* <p>Using no namespace prefix in DOM Level 3 XPath queries, implies you
|
||||
* are looking for elements in the null namespace. If you need to look
|
||||
* for nodes in the default namespace, you need to map a prefix to it
|
||||
* first like:</p>
|
||||
* <pre>Sarissa.setXpathNamespaces(oDoc, "xmlns:myprefix'http://mynsURI'");</pre>
|
||||
* <p><b>Note 1 </b>: Use this method only if the source document features
|
||||
* a default namespace (without a prefix), otherwise just use IE's setProperty
|
||||
* (moz will rezolve non-default namespaces by itself). You will need to map that
|
||||
* namespace to a prefix for queries to work.</p>
|
||||
* <p><b>Note 2 </b>: This method calls IE's setProperty method to set the
|
||||
* appropriate namespace-prefix mappings, so you dont have to do that.</p>
|
||||
* @param oDoc The target XMLDocument to set the namespace mappings for.
|
||||
* @param sNsSet A whilespace-seperated list of namespace declarations as
|
||||
* those would appear in an XML document. E.g.:
|
||||
* <code>"xmlns:xhtml='http://www.w3.org/1999/xhtml'
|
||||
* xmlns:'http://www.w3.org/1999/XSL/Transform'"</code>
|
||||
* @throws An error if the format of the given namespace declarations is bad.
|
||||
*/
|
||||
Sarissa.setXpathNamespaces = function(oDoc, sNsSet) {
|
||||
//oDoc._sarissa_setXpathNamespaces(sNsSet);
|
||||
oDoc._sarissa_useCustomResolver = true;
|
||||
var namespaces = sNsSet.indexOf(" ")>-1?sNsSet.split(" "):[sNsSet];
|
||||
oDoc._sarissa_xpathNamespaces = [];
|
||||
for(var i=0;i < namespaces.length;i++){
|
||||
var ns = namespaces[i];
|
||||
var colonPos = ns.indexOf(":");
|
||||
var assignPos = ns.indexOf("=");
|
||||
if(colonPos > 0 && assignPos > colonPos+1){
|
||||
var prefix = ns.substring(colonPos+1, assignPos);
|
||||
var uri = ns.substring(assignPos+2, ns.length-1);
|
||||
oDoc._sarissa_xpathNamespaces[prefix] = uri;
|
||||
}else{
|
||||
throw "Bad format on namespace declaration(s) given";
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* @private Flag to control whether a custom namespace resolver should
|
||||
* be used, set to true by Sarissa.setXpathNamespaces
|
||||
*/
|
||||
XMLDocument.prototype._sarissa_useCustomResolver = false;
|
||||
/** @private */
|
||||
XMLDocument.prototype._sarissa_xpathNamespaces = [];
|
||||
/**
|
||||
* <p>Extends the XMLDocument to emulate IE's selectNodes.</p>
|
||||
* @argument sExpr the XPath expression to use
|
||||
* @argument contextNode this is for internal use only by the same
|
||||
* method when called on Elements
|
||||
* @returns the result of the XPath search as a SarissaNodeList
|
||||
* @throws An error if no namespace URI is found for the given prefix.
|
||||
*/
|
||||
XMLDocument.prototype.selectNodes = function(sExpr, contextNode, returnSingle){
|
||||
var nsDoc = this;
|
||||
var nsresolver;
|
||||
if(this._sarissa_useCustomResolver){
|
||||
nsresolver = function(prefix){
|
||||
var s = nsDoc._sarissa_xpathNamespaces[prefix];
|
||||
if(s){
|
||||
return s;
|
||||
}
|
||||
else {
|
||||
throw "No namespace URI found for prefix: '" + prefix+"'";
|
||||
}
|
||||
};
|
||||
}
|
||||
else{
|
||||
nsresolver = this.createNSResolver(this.documentElement);
|
||||
}
|
||||
var result = null;
|
||||
if(!returnSingle){
|
||||
var oResult = this.evaluate(sExpr,
|
||||
(contextNode?contextNode:this),
|
||||
nsresolver,
|
||||
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
|
||||
var nodeList = new SarissaNodeList(oResult.snapshotLength);
|
||||
nodeList.expr = sExpr;
|
||||
for(var i=0;i<nodeList.length;i++){
|
||||
nodeList[i] = oResult.snapshotItem(i);
|
||||
}
|
||||
result = nodeList;
|
||||
}
|
||||
else {
|
||||
result = this.evaluate(sExpr,
|
||||
(contextNode?contextNode:this),
|
||||
nsresolver,
|
||||
XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
/**
|
||||
* <p>Extends the Element to emulate IE's selectNodes</p>
|
||||
* @argument sExpr the XPath expression to use
|
||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
||||
* @throws An
|
||||
* error if invoked on an HTML Element as this is only be
|
||||
* available to XML Elements.
|
||||
*/
|
||||
Element.prototype.selectNodes = function(sExpr){
|
||||
var doc = this.ownerDocument;
|
||||
if(doc.selectNodes){
|
||||
return doc.selectNodes(sExpr, this);
|
||||
}
|
||||
else{
|
||||
throw "Method selectNodes is only supported by XML Elements";
|
||||
}
|
||||
};
|
||||
/**
|
||||
* <p>Extends the XMLDocument to emulate IE's selectSingleNode.</p>
|
||||
* @argument sExpr the XPath expression to use
|
||||
* @argument contextNode this is for internal use only by the same
|
||||
* method when called on Elements
|
||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
||||
*/
|
||||
XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode){
|
||||
var ctx = contextNode?contextNode:null;
|
||||
return this.selectNodes(sExpr, ctx, true);
|
||||
};
|
||||
/**
|
||||
* <p>Extends the Element to emulate IE's selectSingleNode.</p>
|
||||
* @argument sExpr the XPath expression to use
|
||||
* @returns the result of the XPath search as an (Sarissa)NodeList
|
||||
* @throws An error if invoked on an HTML Element as this is only be
|
||||
* available to XML Elements.
|
||||
*/
|
||||
Element.prototype.selectSingleNode = function(sExpr){
|
||||
var doc = this.ownerDocument;
|
||||
if(doc.selectSingleNode){
|
||||
return doc.selectSingleNode(sExpr, this);
|
||||
}
|
||||
else{
|
||||
throw "Method selectNodes is only supported by XML Elements";
|
||||
}
|
||||
};
|
||||
Sarissa.IS_ENABLED_SELECT_NODES = true;
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
<?xml version='1.0'?>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
|
||||
<xsl:output method="html" />
|
||||
|
||||
<xsl:template match="xbel">
|
||||
<ul><xsl:apply-templates/></ul>
|
||||
</xsl:template>
|
||||
|
||||
<!-- Only partial support for xbel elements -->
|
||||
<xsl:template match="xbel/info|xbel/title|xbel/desc|xbel/alias|xbel/separator">
|
||||
<!-- No op -->
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="folder">
|
||||
<li>
|
||||
<xsl:apply-templates select="title"/>
|
||||
<ul>
|
||||
<xsl:apply-templates select="folder|bookmark"/>
|
||||
</ul>
|
||||
</li>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="folder/title">
|
||||
<span class="folder"><xsl:apply-templates/></span>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="bookmark">
|
||||
<li>
|
||||
<a href="{@href}">
|
||||
<xsl:apply-templates select="title"/>
|
||||
</a>
|
||||
</li>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="bookmark/title">
|
||||
<span class="file"><xsl:apply-templates/></span>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|