- 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-ef5d649a1542
This commit is contained in:
apfelmaennchen 2008-09-24 21:09:12 +00:00
parent 7462b5db7b
commit 848dbbd280
26 changed files with 1824 additions and 17 deletions

View File

@ -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; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -15,7 +15,11 @@
<link media="screen" type="text/css" href="css/jquery.pagination.css" rel="stylesheet" />
<link media="screen" type="text/css" href="css/jquery.flexigrid.css" rel="stylesheet" />
<link media="screen" type="text/css" href="css/jquery.dialog.css" rel="stylesheet" />
<link media="screen" type="text/css" href="css/jquery.treeview.css" rel="stylesheet" />
<script type="text/javascript" src="js/sarissa.js"></script>
<script type="text/javascript" src="js/sarissa_ieemu_xpath.js"></script>
<script src="js/jquery-1.2.6.min.js" type="text/javascript"></script>
<script src="js/jquery.ui.all.min.js" type="text/javascript"></script>
@ -28,7 +32,9 @@
<script src="js/jquery.pagination.js" type="text/javascript"></script>
<script src="js/jquery-faviconize-1.0.js" type="text/javascript"></script>
<script src="js/jquery-flexigrid.js" type="text/javascript"></script>
<script src="js/jquery-flexigrid.js" type="text/javascript"></script>
<script src="js/jquery.treeview.min.js" type="text/javascript"></script>
<script src="js/jquery.xslTransform.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[

View File

@ -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);

View File

@ -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);

1025
htroot/yacy/ui/js/sarissa.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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>&quot;xmlns:xhtml=&apos;http://www.w3.org/1999/xhtml&apos;
* xmlns:&apos;http://www.w3.org/1999/XSL/Transform&apos;&quot;</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;
}

View File

@ -5,6 +5,7 @@
/* Init Sidebar_2 */
$("#side2").accordion({
autoHeight: false,
fillSpace: true,
header: "h3"
});
$("#side2").accordion("activate", 1);
@ -36,7 +37,13 @@
});
}); //close each(
}
}); //close $.ajax(
}); //close $.ajax(
/* Load Folders */
$("#yfolder").getTransform('xsl/xbel2folder-ul.xsl','/xml/bookmarks/xbel/xbel.xml');
$("#yfolder").treeview({
collapsed: true,
unique: true
});
});
//]]>
</script>
@ -78,7 +85,10 @@
<div class="menu">
<p id="tagcloud"></p>
</div>
<h3>Bookmark Folders</h3> <!-- 2 -->
<div class="menu">
<ul class="filetree" id="yfolder"></ul>
</div>

View File

@ -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>

View File

@ -23,8 +23,11 @@
url: "/xml/bookmarks/posts/add_p.xml?login="+query,
dataType: "xml",
success: function(xml) {
$('#bmaddform').resetForm();
$("#bmadd").dialog("close");
$tabs.tabs("load", 3);
$tabs.tabs("load", 3);
$("#side2 *").remove();
$("#side2").load("sidebar/sidebar_2.html");
}
});
}

View File

@ -7,8 +7,8 @@
url: query,
async: false,
dataType: "xml",
success: function(xml) {
if ($.browser.mozilla && ($.browser.version.replace(".","","g") > 1800)) {
success: function(xml) {
if (($.browser.mozilla && (parseInt($.browser.version.replace(".","","g")) > 1800))) {
var totalResults = parseInt($(xml).find('opensearch\\:totalResults').text().replace(",","","g"));
var startIndex = parseInt($(xml).find('opensearch\\:startIndex').text());
var itemsPerPage = parseInt($(xml).find('opensearch\\:itemsPerPage').text());
@ -41,13 +41,13 @@
{display: 'Date', name : 'date', width : 130, sortable : true, align: 'left'}
],
buttons: [
{name: 'Bookmark', bclass: 'bookmark', onpress: test},
{name: 'Crawl', bclass: 'crawl', onpress: test},
{name: 'Blacklist', bclass: 'blacklist', onpress: test},
{name: 'Refresh', bclass: 'load', onpress: load},
{name: 'Bookmark', bclass: 'bookmark', onpress: yaction},
{name: 'Crawl', bclass: 'crawl', onpress: yaction},
{name: 'Blacklist', bclass: 'blacklist', onpress: yaction},
{name: 'Refresh', bclass: 'load', onpress: yload},
{separator: true},
{name: page, bclass: 'prev', onpress: load},
{name: '&nbsp;', bclass: 'next', onpress: load},
{name: page, bclass: 'prev', onpress: yload},
{name: '&nbsp;', bclass: 'next', onpress: yload},
{separator: true}
],
striped: true,
@ -66,9 +66,9 @@
});
*/
function test(com, grid) {
function yaction(com, grid) {
if (com == 'Bookmark') {
confirm('Add' + $('.trSelected',grid).length + ' bookmark(s)?')
confirm('Add ' + $('.trSelected',grid).length + ' search results to bookmark(s)?')
$('.trSelected',grid).each(function(){
var url = $(this).find('.url').text();
var title = $(this).find('.linktitle').text();
@ -82,7 +82,7 @@
url: "/xml/bookmarks/posts/add_p.xml?login="+query,
dataType: "xml",
success: function(xml) {
alert("Posted bookmark for: "+url);
alert("Debug: posted bookmark for: "+url);
}
});
});
@ -90,7 +90,7 @@
alert("Test!");
}
}
function load(com, grid) {
function yload(com, grid) {
var $tabs = $('#container ul');
var count = parseInt($(tabid).attr('count'));
var offset = parseInt($(tabid).attr('offset'));

View File

@ -7,6 +7,7 @@
apfelmaennchen
<h3>Change Log</h3>
<ul>
<li>23-09-2008: Added bookmark folder widget to sidebar (it uses the xbel.xml with XSLT!</li>
<li>21-09-2008: Enabled the new language selection - special thanks to orbiter</li>
<li>21-09-2008: Added basic functionallity to add bookmark(s) from search results</li>
<li>21-09-2008: Re-design of sidebar search form</li>