darkfish-rdoc 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +176 -117
- data/Rakefile +40 -3
- data/Rakefile.local +16 -0
- data/lib/rdoc/generator/darkfish.rb +11 -7
- data/lib/rdoc/generator/template/darkfish/classpage.rhtml +1 -2
- data/lib/rdoc/generator/template/darkfish/js/jquery.js +23 -23
- data/lib/rdoc/generator/template/darkfish/js/quicksearch.js +27 -5
- data/lib/rdoc/generator/template/darkfish/rdoc.css +4 -6
- data/rake/dependencies.rb +25 -11
- data/rake/helpers.rb +16 -12
- data/rake/manual.rb +435 -64
- data/rake/publishing.rb +15 -10
- data/rake/rdoc.rb +6 -2
- data/rake/svn.rb +64 -6
- data/rake/testing.rb +3 -2
- data/spec/rdoc/generator/darkfish_spec.rb +13 -2
- metadata +2 -2
data/Rakefile.local
CHANGED
@@ -19,3 +19,19 @@ namespace :release do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
task :install do
|
23
|
+
log "Installing template files"
|
24
|
+
sitelib = Pathname.new( CONFIG['sitelibdir'] )
|
25
|
+
sitearch = Pathname.new( CONFIG['sitearchdir'] )
|
26
|
+
|
27
|
+
Dir.chdir( LIBDIR ) do
|
28
|
+
EXTRA_PKGFILES.each do |templatefile|
|
29
|
+
relpath = templatefile.relative_path_from( LIBDIR )
|
30
|
+
target = sitelib + relpath
|
31
|
+
FileUtils.mkpath target.dirname,
|
32
|
+
:mode => 0755, :verbose => true, :noop => $dryrun unless target.dirname.directory?
|
33
|
+
FileUtils.install relpath, target,
|
34
|
+
:mode => 0644, :verbose => true, :noop => $dryrun
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!ruby
|
2
2
|
#
|
3
3
|
# Darkfish RDoc HTML Generator
|
4
|
-
# $Id: darkfish.rb
|
4
|
+
# $Id: darkfish.rb 35 2008-09-22 15:14:43Z deveiant $
|
5
5
|
#
|
6
6
|
# Author: Michael Granger <ged@FaerieMUD.org>
|
7
7
|
#
|
@@ -48,17 +48,17 @@ class RDoc::Generator::Darkfish < RDoc::Generator::XML
|
|
48
48
|
include ERB::Util
|
49
49
|
|
50
50
|
# Subversion rev
|
51
|
-
SVNRev = %$Rev:
|
51
|
+
SVNRev = %$Rev: 35 $
|
52
52
|
|
53
53
|
# Subversion ID
|
54
|
-
SVNId = %$Id: darkfish.rb
|
54
|
+
SVNId = %$Id: darkfish.rb 35 2008-09-22 15:14:43Z deveiant $
|
55
55
|
|
56
56
|
# Path to this file's parent directory. Used to find templates and other
|
57
57
|
# resources.
|
58
58
|
GENERATOR_DIR = Pathname.new( __FILE__ ).expand_path.dirname
|
59
59
|
|
60
60
|
# Release Version
|
61
|
-
VERSION = '1.1.
|
61
|
+
VERSION = '1.1.5'
|
62
62
|
|
63
63
|
|
64
64
|
#################################################################
|
@@ -118,7 +118,7 @@ class RDoc::Generator::Darkfish < RDoc::Generator::XML
|
|
118
118
|
debug_msg "Copying over static files"
|
119
119
|
staticfiles = %w[rdoc.css js images]
|
120
120
|
staticfiles.each do |path|
|
121
|
-
FileUtils.cp_r( @template_dir + path, '.', :verbose => $DEBUG )
|
121
|
+
FileUtils.cp_r( @template_dir + path, '.', :verbose => $DEBUG, :noop => $dryrun )
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
@@ -129,7 +129,11 @@ class RDoc::Generator::Darkfish < RDoc::Generator::XML
|
|
129
129
|
### the extracted information.
|
130
130
|
def generate( toplevels )
|
131
131
|
@outputdir = Pathname.new( @options.op_dir ).expand_path( @basedir )
|
132
|
-
|
132
|
+
if RDoc::Generator::Context.respond_to?( :build_indicies)
|
133
|
+
@files, @classes = RDoc::Generator::Context.build_indicies( toplevels, @options )
|
134
|
+
else
|
135
|
+
@files, @classes = RDoc::Generator::Context.build_indices( toplevels, @options )
|
136
|
+
end
|
133
137
|
|
134
138
|
# Now actually write the output
|
135
139
|
generate_xhtml( @options, @files, @classes )
|
@@ -292,7 +296,7 @@ class RDoc::Generator::Darkfish < RDoc::Generator::XML
|
|
292
296
|
end
|
293
297
|
|
294
298
|
|
295
|
-
# %q$Id: darkfish.rb
|
299
|
+
# %q$Id: darkfish.rb 35 2008-09-22 15:14:43Z deveiant $"
|
296
300
|
SVNID_PATTERN = /
|
297
301
|
\$Id:\s
|
298
302
|
(\S+)\s # filename
|
@@ -213,8 +213,7 @@
|
|
213
213
|
# If the method doesn't have a 'name' attribute, it's defined in C, so make one out of the
|
214
214
|
# first method name in the callseq.
|
215
215
|
unless methodinfo['name']
|
216
|
-
methodinfo['name'] = methodinfo['callseq'][/^.*?\.(\w+)/, 1]
|
217
|
-
raise "No method name nor callseq!"
|
216
|
+
methodinfo['name'] = methodinfo['callseq'][/^.*?\.(\w+)/, 1] || methodinfo['callseq']
|
218
217
|
end
|
219
218
|
%>
|
220
219
|
<% if methodinfo['m_desc'] =~ /Alias for/ %>
|
@@ -1,32 +1,32 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery 1.2.
|
2
|
+
* jQuery 1.2.6 - New Wave Javascript
|
3
3
|
*
|
4
4
|
* Copyright (c) 2008 John Resig (jquery.com)
|
5
5
|
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
6
6
|
* and GPL (GPL-LICENSE.txt) licenses.
|
7
7
|
*
|
8
|
-
* $Date: 2008-
|
9
|
-
* $Rev:
|
8
|
+
* $Date: 2008-09-25 10:08:59 -0700 (Thu, 25 Sep 2008) $
|
9
|
+
* $Rev: 39 $
|
10
10
|
*/
|
11
|
-
(function(){
|
12
|
-
selector=[];}}else
|
13
|
-
return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.4",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;this.each(function(i){if(this==elem)ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],name)||undefined;else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
|
11
|
+
(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
|
12
|
+
return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
|
14
13
|
return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
|
15
|
-
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return
|
16
|
-
return(this[0].value||"").replace(/\r/g,"");}return undefined;}return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=
|
17
|
-
this.value=value;});},html:function(value){return value==undefined?(this
|
18
|
-
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))
|
19
|
-
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==
|
20
|
-
script.appendChild(document.createTextNode(data));head.
|
21
|
-
for(
|
22
|
-
for(var
|
23
|
-
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret;function color(elem){if(!jQuery.browser.safari)return false;var ret=
|
24
|
-
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var
|
25
|
-
ret=array
|
26
|
-
for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv&&callback(elems[i],i)||inv&&!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!==null&&value!=undefined){if(value.constructor!=Array)value=[value];ret=ret.concat(value);}}return ret;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval!=undefined)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
|
27
|
-
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data
|
28
|
-
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.
|
29
|
-
|
14
|
+
selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
|
15
|
+
return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
|
16
|
+
this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
|
17
|
+
return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
|
18
|
+
jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&©&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
|
19
|
+
script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
|
20
|
+
for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
|
21
|
+
for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
|
22
|
+
jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
|
23
|
+
ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
|
24
|
+
while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
|
25
|
+
while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
|
26
|
+
for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
|
27
|
+
jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
|
28
|
+
xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
|
29
|
+
jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
|
30
30
|
for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
|
31
|
-
s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(
|
32
|
-
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.
|
31
|
+
s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
|
32
|
+
e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
|
@@ -1,12 +1,12 @@
|
|
1
1
|
/**
|
2
2
|
*
|
3
3
|
* JQuery QuickSearch - Hook up a form field to hide non-matching elements.
|
4
|
-
* $Id: quicksearch.js
|
4
|
+
* $Id: quicksearch.js 39 2008-09-25 17:08:59Z deveiant $
|
5
5
|
*
|
6
6
|
* Author: Michael Granger <mgranger@laika.com>
|
7
7
|
*
|
8
8
|
*/
|
9
|
-
|
9
|
+
jQuery.fn.quicksearch = function( target, searchElems, options ) {
|
10
10
|
// console.debug( "Quicksearch fn" );
|
11
11
|
|
12
12
|
var settings = {
|
@@ -18,15 +18,16 @@ $.fn.quicksearch = function( target, searchElems, options ) {
|
|
18
18
|
};
|
19
19
|
if ( options ) $.extend( settings, options );
|
20
20
|
|
21
|
-
return
|
21
|
+
return jQuery(this).each( function() {
|
22
22
|
// console.debug( "Creating a new quicksearch on %o for %o", this, searchElems );
|
23
|
-
new
|
23
|
+
new jQuery.quicksearch( this, searchElems, settings );
|
24
24
|
});
|
25
25
|
};
|
26
26
|
|
27
27
|
|
28
|
-
|
28
|
+
jQuery.quicksearch = function( searchBox, searchElems, settings ) {
|
29
29
|
var timeout;
|
30
|
+
var boxdiv = $(searchBox).parents('div').eq(0);
|
30
31
|
|
31
32
|
function init() {
|
32
33
|
setupKeyEventHandlers();
|
@@ -107,6 +108,27 @@ $.quicksearch = function( searchBox, searchElems, settings ) {
|
|
107
108
|
if ( shownCount == 0 && settings.noSearchResultsIndicator ) {
|
108
109
|
$('#' + settings.noSearchResultsIndicator).slideDown();
|
109
110
|
}
|
111
|
+
|
112
|
+
|
113
|
+
var boxpos = $(boxdiv).offset();
|
114
|
+
var boxHeight = $(boxdiv).height() - boxpos.top;
|
115
|
+
var viewHeight = $(window).height();
|
116
|
+
|
117
|
+
console.debug( "Boxpos: %o, boxHeight: %d, viewHeight: %d", boxpos, boxHeight, viewHeight );
|
118
|
+
|
119
|
+
// Center the quicksearch's container div vertically if it can all fit
|
120
|
+
if ( viewHeight > boxHeight ) {
|
121
|
+
var y = Math.ceil(( viewHeight - boxHeight ) / 2);
|
122
|
+
console.debug( "Center-scrolling strategy: %d", y );
|
123
|
+
$(window).scrollTop( 0, y );
|
124
|
+
}
|
125
|
+
|
126
|
+
// Or else position the page such that the search field is at the bottom of the viewport.
|
127
|
+
else {
|
128
|
+
var y = boxpos.top + $(boxpos).height() - viewHeight;
|
129
|
+
console.debug( "Bottom-aligned strategy: %d", y );
|
130
|
+
$(window).scrollTop( 0, y );
|
131
|
+
}
|
110
132
|
};
|
111
133
|
|
112
134
|
init();
|
@@ -1,11 +1,6 @@
|
|
1
|
-
/* @override
|
2
|
-
http://localhost/darkfish/rdoc.css
|
3
|
-
http://gont.ljc.laika.com:3474/manual/api/rdoc.css
|
4
|
-
*/
|
5
|
-
|
6
1
|
/*
|
7
2
|
* "Darkfish" Rdoc CSS
|
8
|
-
* $Id: rdoc.css
|
3
|
+
* $Id: rdoc.css 41 2008-09-26 06:14:25Z deveiant $
|
9
4
|
*
|
10
5
|
* Author: Michael Granger <ged@FaerieMUD.org>
|
11
6
|
*
|
@@ -294,8 +289,11 @@ ul.link-list .type {
|
|
294
289
|
|
295
290
|
#constants-list dl,
|
296
291
|
#attributes-list dl {
|
292
|
+
margin: 1em 1em 2em;
|
297
293
|
margin-bottom: 2em;
|
298
294
|
margin-top: 1em;
|
295
|
+
|
296
|
+
border: 0;
|
299
297
|
}
|
300
298
|
#constants-list dl dt,
|
301
299
|
#attributes-list dl dt {
|
data/rake/dependencies.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Dependency-checking and Installation Rake Tasks
|
3
|
-
# $Id: dependencies.rb
|
3
|
+
# $Id: dependencies.rb 43 2008-09-05 18:19:16Z deveiant $
|
4
4
|
#
|
5
5
|
|
6
6
|
require 'rubygems/dependency_installer'
|
@@ -9,8 +9,7 @@ require 'rubygems/requirement'
|
|
9
9
|
require 'rubygems/doc_manager'
|
10
10
|
|
11
11
|
### Install the specified +gems+ if they aren't already installed.
|
12
|
-
def install_gems(
|
13
|
-
gems.flatten!
|
12
|
+
def install_gems( gems )
|
14
13
|
|
15
14
|
defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
|
16
15
|
:generate_rdoc => true,
|
@@ -28,20 +27,28 @@ def install_gems( *gems )
|
|
28
27
|
|
29
28
|
gemindex = Gem::SourceIndex.from_installed_gems
|
30
29
|
|
31
|
-
gems.each do |gemname|
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
gems.each do |gemname, reqstring|
|
31
|
+
requirement = Gem::Requirement.new( reqstring )
|
32
|
+
trace "requirement is: %p" % [ requirement ]
|
33
|
+
|
34
|
+
trace "Searching for an installed #{gemname}..."
|
35
|
+
specs = gemindex.find_name( gemname )
|
36
|
+
trace "...found %d specs: %s" %
|
37
|
+
[ specs.length, specs.collect {|s| "%s %s" % [s.name, s.version] }.join(', ') ]
|
38
|
+
|
39
|
+
if spec = specs.find {|spec| requirement.satisfied_by?(spec.version) }
|
40
|
+
log "Version %s of %s is already installed (needs %s); skipping..." %
|
41
|
+
[ spec.version, spec.name, requirement ]
|
35
42
|
next
|
36
43
|
end
|
37
44
|
|
38
45
|
rgv = Gem::Version.new( Gem::RubyGemsVersion )
|
39
46
|
installer = nil
|
40
47
|
|
41
|
-
log "Trying to install #{gemname.inspect}..."
|
48
|
+
log "Trying to install #{gemname.inspect} #{requirement}..."
|
42
49
|
if rgv >= Gem::Version.new( '1.1.1' )
|
43
50
|
installer = Gem::DependencyInstaller.new
|
44
|
-
installer.install( gemname )
|
51
|
+
installer.install( gemname, requirement )
|
45
52
|
else
|
46
53
|
installer = Gem::DependencyInstaller.new( gemname )
|
47
54
|
installer.install
|
@@ -55,8 +62,15 @@ def install_gems( *gems )
|
|
55
62
|
end
|
56
63
|
|
57
64
|
|
58
|
-
### Task: install
|
65
|
+
### Task: install runtime dependencies
|
66
|
+
desc "Install runtime dependencies as gems"
|
59
67
|
task :install_dependencies do
|
60
|
-
install_gems( DEPENDENCIES
|
68
|
+
install_gems( DEPENDENCIES )
|
69
|
+
end
|
70
|
+
|
71
|
+
### Task: install gems for development tasks
|
72
|
+
desc "Install development dependencies as gems"
|
73
|
+
task :install_dev_dependencies do
|
74
|
+
install_gems( DEVELOPMENT_DEPENDENCIES )
|
61
75
|
end
|
62
76
|
|
data/rake/helpers.rb
CHANGED
@@ -279,8 +279,7 @@ def prompt_for_multiple_values( label, default=nil )
|
|
279
279
|
end
|
280
280
|
|
281
281
|
|
282
|
-
### Turn echo and masking of input on/off.
|
283
|
-
### Ruby-Password by Ian Macdonald <ian@caliban.org>.
|
282
|
+
### Turn echo and masking of input on/off.
|
284
283
|
def noecho( masked=false )
|
285
284
|
require 'termios'
|
286
285
|
|
@@ -288,13 +287,15 @@ def noecho( masked=false )
|
|
288
287
|
term = Termios.getattr( $stdin )
|
289
288
|
|
290
289
|
begin
|
291
|
-
term.
|
292
|
-
|
290
|
+
newt = term.dup
|
291
|
+
newt.c_lflag &= ~Termios::ECHO
|
292
|
+
newt.c_lflag &= ~Termios::ICANON if masked
|
293
|
+
|
294
|
+
Termios.tcsetattr( $stdin, Termios::TCSANOW, newt )
|
293
295
|
|
294
296
|
rval = yield
|
295
297
|
ensure
|
296
|
-
|
297
|
-
Termios.setattr( $stdin, Termios::TCSANOW, term )
|
298
|
+
Termios.tcsetattr( $stdin, Termios::TCSANOW, term )
|
298
299
|
end
|
299
300
|
|
300
301
|
return rval
|
@@ -313,22 +314,25 @@ end
|
|
313
314
|
|
314
315
|
### Display a description of a potentially-dangerous task, and prompt
|
315
316
|
### for confirmation. If the user answers with anything that begins
|
316
|
-
### with 'y', yield to the block
|
317
|
-
|
317
|
+
### with 'y', yield to the block. If +abort_on_decline+ is +true+,
|
318
|
+
### any non-'y' answer will fail with an error message.
|
319
|
+
def ask_for_confirmation( description, abort_on_decline=true )
|
318
320
|
puts description
|
319
321
|
|
320
322
|
answer = prompt_with_default( "Continue?", 'n' ) do |input|
|
321
323
|
input =~ /^[yn]/i
|
322
324
|
end
|
323
325
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
else
|
326
|
+
if answer =~ /^y/i
|
327
|
+
return yield
|
328
|
+
elsif abort_on_decline
|
328
329
|
error "Aborted."
|
329
330
|
fail
|
330
331
|
end
|
332
|
+
|
333
|
+
return false
|
331
334
|
end
|
335
|
+
alias :prompt_for_confirmation :ask_for_confirmation
|
332
336
|
|
333
337
|
|
334
338
|
### Search line-by-line in the specified +file+ for the given +regexp+, returning the
|
data/rake/manual.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
#
|
2
2
|
# Manual-generation Rake tasks and classes
|
3
|
-
# $Id: manual.rb
|
3
|
+
# $Id: manual.rb 41 2008-08-28 16:46:09Z deveiant $
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# Authors:
|
6
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
7
|
+
# * Mahlon E. Smith <mahlon@martini.nu>
|
6
8
|
#
|
7
9
|
# This was born out of a frustration with other static HTML generation modules
|
8
10
|
# and systems. I've tried webby, webgen, rote, staticweb, staticmatic, and
|
@@ -49,18 +51,25 @@ module Manual
|
|
49
51
|
end
|
50
52
|
|
51
53
|
|
54
|
+
### Export any static resources required by this filter to the given +output_dir+.
|
55
|
+
def export_resources( output_dir )
|
56
|
+
# No-op by default
|
57
|
+
end
|
58
|
+
|
59
|
+
|
52
60
|
### Process the +page+'s source with the filter and return the altered content.
|
53
61
|
def process( source, page, metadata )
|
54
62
|
raise NotImplementedError,
|
55
63
|
"%s does not implement the #process method" % [ self.class.name ]
|
56
64
|
end
|
57
|
-
end
|
65
|
+
end # class Filter
|
58
66
|
|
59
67
|
|
60
68
|
### The default page configuration if none is specified.
|
61
69
|
DEFAULT_CONFIG = {
|
62
|
-
'filters' => [ '
|
70
|
+
'filters' => [ 'erb', 'links', 'textile' ],
|
63
71
|
'layout' => 'default.page',
|
72
|
+
'cleanup' => true,
|
64
73
|
}.freeze
|
65
74
|
|
66
75
|
# Pattern to match a source page with a YAML header
|
@@ -74,24 +83,30 @@ module Manual
|
|
74
83
|
# Options to pass to libtidy
|
75
84
|
TIDY_OPTIONS = {
|
76
85
|
:show_warnings => true,
|
77
|
-
:indent =>
|
86
|
+
:indent => true,
|
78
87
|
:indent_attributes => false,
|
79
88
|
:indent_spaces => 4,
|
80
89
|
:vertical_space => true,
|
81
90
|
:tab_size => 4,
|
82
91
|
:wrap_attributes => true,
|
83
92
|
:wrap => 100,
|
93
|
+
:char_encoding => 'utf8'
|
84
94
|
}
|
85
95
|
|
86
96
|
|
87
97
|
### Create a new page-generator for the given +sourcefile+, which will use
|
88
|
-
### ones of the templates in +layouts_dir+ as a wrapper.
|
89
|
-
|
90
|
-
|
98
|
+
### ones of the templates in +layouts_dir+ as a wrapper. The +basepath+
|
99
|
+
### is the path to the base output directory, and the +catalog+ is the
|
100
|
+
### Manual::PageCatalog to which the page belongs.
|
101
|
+
def initialize( catalog, sourcefile, layouts_dir, basepath='.' )
|
102
|
+
@catalog = catalog
|
103
|
+
@sourcefile = Pathname.new( sourcefile )
|
91
104
|
@layouts_dir = Pathname.new( layouts_dir )
|
105
|
+
@basepath = basepath
|
92
106
|
|
93
107
|
rawsource = @sourcefile.read
|
94
108
|
@config, @source = self.read_page_config( rawsource )
|
109
|
+
|
95
110
|
# $stderr.puts "Config is: %p" % [@config],
|
96
111
|
# "Source is: %p" % [ @source[0,100] ]
|
97
112
|
@filters = self.load_filters( @config['filters'] )
|
@@ -104,6 +119,12 @@ module Manual
|
|
104
119
|
public
|
105
120
|
######
|
106
121
|
|
122
|
+
# The Manual::PageCatalog to which the page belongs
|
123
|
+
attr_reader :catalog
|
124
|
+
|
125
|
+
# The relative path to the base directory, for prepending to page paths
|
126
|
+
attr_reader :basepath
|
127
|
+
|
107
128
|
# The Pathname object that specifys the page source file
|
108
129
|
attr_reader :sourcefile
|
109
130
|
|
@@ -124,18 +145,28 @@ module Manual
|
|
124
145
|
def generate( metadata )
|
125
146
|
content = self.generate_content( @source, metadata )
|
126
147
|
|
127
|
-
|
128
|
-
templatepath = @layouts_dir +
|
148
|
+
layout = self.config['layout'].sub( /\.page$/, '' )
|
149
|
+
templatepath = @layouts_dir + "#{layout}.page"
|
129
150
|
template = ERB.new( templatepath.read )
|
130
151
|
page = self
|
131
152
|
|
132
153
|
html = template.result( binding() )
|
133
154
|
|
134
|
-
#
|
155
|
+
# Use Tidy to clean up the html if 'cleanup' is turned on, but remove the Tidy
|
156
|
+
# meta-generator propaganda/advertising.
|
157
|
+
html = self.cleanup( html ).sub( %r:<meta name="generator"[^>]*tidy[^>]*/>:im, '' ) if
|
158
|
+
self.config['cleanup']
|
159
|
+
|
135
160
|
return html
|
136
161
|
end
|
137
162
|
|
138
163
|
|
164
|
+
### Return the page title as specified in the YAML options
|
165
|
+
def title
|
166
|
+
return self.config['title'] || self.sourcefile.basename
|
167
|
+
end
|
168
|
+
|
169
|
+
|
139
170
|
### Run the various filters on the given input and return the transformed
|
140
171
|
### content.
|
141
172
|
def generate_content( input, metadata )
|
@@ -168,8 +199,9 @@ module Manual
|
|
168
199
|
tidy.options.output_xhtml = true
|
169
200
|
|
170
201
|
xml = tidy.clean( source )
|
171
|
-
|
172
|
-
|
202
|
+
errors = tidy.errors
|
203
|
+
error_message( errors.join ) unless errors.empty?
|
204
|
+
trace tidy.diagnostics
|
173
205
|
return xml
|
174
206
|
end
|
175
207
|
rescue LoadError => err
|
@@ -187,6 +219,237 @@ module Manual
|
|
187
219
|
end
|
188
220
|
end
|
189
221
|
|
222
|
+
|
223
|
+
### Build the index relative to the receiving page and return it as a String
|
224
|
+
def make_index_html
|
225
|
+
items = [ '<div class="index">' ]
|
226
|
+
|
227
|
+
@catalog.traverse_page_hierarchy( self ) do |type, title, path|
|
228
|
+
case type
|
229
|
+
when :section
|
230
|
+
items << %Q{<div class="section">}
|
231
|
+
items << %Q{<h2><a href="#{self.basepath + path}/">#{title}</a></h2>}
|
232
|
+
items << '<ul class="index-section">'
|
233
|
+
|
234
|
+
when :current_section
|
235
|
+
items << %Q{<div class="section current-section">}
|
236
|
+
items << %Q{<h2><a href="#{self.basepath + path}/">#{title}</a></h2>}
|
237
|
+
items << '<ul class="index-section current-index-section">'
|
238
|
+
|
239
|
+
when :section_end, :current_section_end
|
240
|
+
items << '</ul></div>'
|
241
|
+
|
242
|
+
when :entry
|
243
|
+
items << %Q{<li><a href="#{self.basepath + path}.html">#{title}</a></li>}
|
244
|
+
|
245
|
+
when :current_entry
|
246
|
+
items << %Q{<li class="current-entry">#{title}</li>}
|
247
|
+
|
248
|
+
else
|
249
|
+
raise "Unknown index entry type %p" % [ type ]
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
items << '</div>'
|
255
|
+
|
256
|
+
return items.join("\n")
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
|
262
|
+
### A catalog of Manual::Page objects that can be referenced by various criteria.
|
263
|
+
class PageCatalog
|
264
|
+
|
265
|
+
### Create a new PageCatalog that will load Manual::Page objects for .page files
|
266
|
+
### in the specified +sourcedir+.
|
267
|
+
def initialize( sourcedir, layoutsdir )
|
268
|
+
@sourcedir = sourcedir
|
269
|
+
@layoutsdir = layoutsdir
|
270
|
+
|
271
|
+
@pages = []
|
272
|
+
@path_index = {}
|
273
|
+
@uri_index = {}
|
274
|
+
@title_index = {}
|
275
|
+
@hierarchy = {}
|
276
|
+
|
277
|
+
self.find_and_load_pages
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
######
|
282
|
+
public
|
283
|
+
######
|
284
|
+
|
285
|
+
# An index of the pages in the catalog by Pathname
|
286
|
+
attr_reader :path_index
|
287
|
+
|
288
|
+
# An index of the pages in the catalog by title
|
289
|
+
attr_reader :title_index
|
290
|
+
|
291
|
+
# An index of the pages in the catalog by the URI of their source relative to the source
|
292
|
+
# directory
|
293
|
+
attr_reader :uri_index
|
294
|
+
|
295
|
+
# The hierarchy of pages in the catalog, suitable for generating an on-page
|
296
|
+
attr_reader :hierarchy
|
297
|
+
|
298
|
+
# An Array of all Manual::Page objects found
|
299
|
+
attr_reader :pages
|
300
|
+
|
301
|
+
# The Pathname location of the .page files.
|
302
|
+
attr_reader :sourcedir
|
303
|
+
|
304
|
+
# The Pathname location of look and feel templates.
|
305
|
+
attr_reader :layoutsdir
|
306
|
+
|
307
|
+
|
308
|
+
### Traverse the catalog's #hierarchy, yielding to the given +builder+
|
309
|
+
### block for each entry, as well as each time a sub-hash is entered or
|
310
|
+
### exited, setting the +type+ appropriately. Valid values for +type+ are:
|
311
|
+
###
|
312
|
+
### :entry, :section, :section_end
|
313
|
+
###
|
314
|
+
### If the optional +from+ value is given, it should be the Manual::Page object
|
315
|
+
### which is considered "current"; if the +from+ object is the same as the
|
316
|
+
### hierarchy entry being yielded, it will be yielded with the +type+ set to
|
317
|
+
### one of:
|
318
|
+
###
|
319
|
+
### :current_entry, :current_section, :current_section_end
|
320
|
+
###
|
321
|
+
### each of which correspond to the like-named type from above.
|
322
|
+
def traverse_page_hierarchy( from=nil, &builder ) # :yields: type, title, path
|
323
|
+
raise LocalJumpError, "no block given" unless builder
|
324
|
+
self.traverse_hierarchy( Pathname.new(''), self.hierarchy, from, &builder )
|
325
|
+
end
|
326
|
+
|
327
|
+
|
328
|
+
#########
|
329
|
+
protected
|
330
|
+
#########
|
331
|
+
|
332
|
+
### Sort and traverse the specified +hash+ recursively, yielding for each entry.
|
333
|
+
def traverse_hierarchy( path, hash, from=nil, &builder )
|
334
|
+
# Now generate the index in the sorted order
|
335
|
+
sort_hierarchy( hash ).each do |subpath, page_or_section|
|
336
|
+
if page_or_section.is_a?( Hash )
|
337
|
+
self.handle_section_callback( path + subpath, page_or_section, from, &builder )
|
338
|
+
else
|
339
|
+
next if subpath == INDEX_PATH
|
340
|
+
self.handle_page_callback( path + subpath, page_or_section, from, &builder )
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
### Return the specified hierarchy of pages as a sorted Array of tuples.
|
347
|
+
### Sort the hierarchy using the 'index' config value of either the
|
348
|
+
### page, or the directory's index page if it's a directory.
|
349
|
+
def sort_hierarchy( hierarchy )
|
350
|
+
hierarchy.sort_by do |subpath, page_or_section|
|
351
|
+
|
352
|
+
# Directory
|
353
|
+
if page_or_section.is_a?( Hash )
|
354
|
+
|
355
|
+
# Use the index of the index page if it exists
|
356
|
+
if page_or_section[INDEX_PATH]
|
357
|
+
idx = page_or_section[INDEX_PATH].config['index']
|
358
|
+
trace "Index page's index for directory '%s' is: %p" % [ subpath, idx ]
|
359
|
+
idx || subpath
|
360
|
+
else
|
361
|
+
trace "Using the path for the sort of directory %p" % [ subpath ]
|
362
|
+
subpath
|
363
|
+
end
|
364
|
+
|
365
|
+
# Page
|
366
|
+
else
|
367
|
+
if subpath == INDEX_PATH
|
368
|
+
trace "Sort index for index page %p is 0" % [ subpath ]
|
369
|
+
0
|
370
|
+
else
|
371
|
+
idx = page_or_section.config['index']
|
372
|
+
trace "Sort index for page %p is: %p" % [ subpath, idx ]
|
373
|
+
idx || subpath
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
end # sort_by
|
378
|
+
end
|
379
|
+
|
380
|
+
|
381
|
+
INDEX_PATH = Pathname.new('index')
|
382
|
+
|
383
|
+
### Build up the data structures necessary for calling the +builder+ callback
|
384
|
+
### for an index section and call it, then recurse into the section contents.
|
385
|
+
def handle_section_callback( path, section, from=nil, &builder )
|
386
|
+
from_current = false
|
387
|
+
|
388
|
+
# Call the callback with :section -- determine the section title from
|
389
|
+
# the 'index.page' file underneath it, or the directory name if no
|
390
|
+
# index.page exists.
|
391
|
+
if section.key?( INDEX_PATH )
|
392
|
+
if section[INDEX_PATH] == from
|
393
|
+
from_current = true
|
394
|
+
builder.call( :current_section, section[INDEX_PATH].title, path )
|
395
|
+
else
|
396
|
+
builder.call( :section, section[INDEX_PATH].title, path )
|
397
|
+
end
|
398
|
+
else
|
399
|
+
title = File.dirname( path ).gsub( /_/, ' ' )
|
400
|
+
builder.call( :section, title, path )
|
401
|
+
end
|
402
|
+
|
403
|
+
# Recurse
|
404
|
+
self.traverse_hierarchy( path, section, from, &builder )
|
405
|
+
|
406
|
+
# Call the callback with :section_end
|
407
|
+
if from_current
|
408
|
+
builder.call( :current_section_end, '', path )
|
409
|
+
else
|
410
|
+
builder.call( :section_end, '', path )
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
|
415
|
+
### Yield the specified +page+ to the builder
|
416
|
+
def handle_page_callback( path, page, from=nil )
|
417
|
+
if from == page
|
418
|
+
yield( :current_entry, page.title, path )
|
419
|
+
else
|
420
|
+
yield( :entry, page.title, path )
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
|
425
|
+
### Find and store
|
426
|
+
|
427
|
+
### Find all .page files under the configured +sourcedir+ and create a new
|
428
|
+
### Manual::Page object for each one.
|
429
|
+
def find_and_load_pages
|
430
|
+
Pathname.glob( @sourcedir + '**/*.page' ).each do |pagefile|
|
431
|
+
path_to_base = @sourcedir.relative_path_from( pagefile.dirname )
|
432
|
+
|
433
|
+
page = Manual::Page.new( self, pagefile, @layoutsdir, path_to_base )
|
434
|
+
hierpath = pagefile.relative_path_from( @sourcedir )
|
435
|
+
|
436
|
+
@pages << page
|
437
|
+
@path_index[ pagefile ] = page
|
438
|
+
@title_index[ page.title ] = page
|
439
|
+
@uri_index[ hierpath.to_s ] = page
|
440
|
+
|
441
|
+
# Place the page in the page hierarchy by using inject to find and/or create the
|
442
|
+
# necessary subhashes. The last run of inject will return the leaf hash in which
|
443
|
+
# the page will live
|
444
|
+
section = hierpath.dirname.split[1..-1].inject( @hierarchy ) do |hier, component|
|
445
|
+
hier[ component ] ||= {}
|
446
|
+
hier[ component ]
|
447
|
+
end
|
448
|
+
|
449
|
+
section[ pagefile.basename('.page') ] = page
|
450
|
+
end
|
451
|
+
end
|
452
|
+
|
190
453
|
end
|
191
454
|
|
192
455
|
|
@@ -203,7 +466,10 @@ module Manual
|
|
203
466
|
### Process the given +source+ as Textile and return the resulting HTML
|
204
467
|
### fragment.
|
205
468
|
def process( source, *ignored )
|
206
|
-
|
469
|
+
formatter = RedCloth::TextileDoc.new( source )
|
470
|
+
formatter.hard_breaks = false
|
471
|
+
formatter.no_span_caps = true
|
472
|
+
return formatter.to_html
|
207
473
|
end
|
208
474
|
|
209
475
|
end
|
@@ -268,6 +534,51 @@ module Manual
|
|
268
534
|
|
269
535
|
attr_reader :name
|
270
536
|
|
537
|
+
|
538
|
+
### Set up the tasks for building the manual
|
539
|
+
def define
|
540
|
+
|
541
|
+
# Set up a description if the caller hasn't already defined one
|
542
|
+
unless Rake.application.last_comment
|
543
|
+
desc "Generate the manual"
|
544
|
+
end
|
545
|
+
|
546
|
+
# Make Pathnames of the directories relative to the base_dir
|
547
|
+
basedir = Pathname.new( @base_dir )
|
548
|
+
sourcedir = basedir + @source_dir
|
549
|
+
layoutsdir = basedir + @layouts_dir
|
550
|
+
outputdir = @output_dir
|
551
|
+
resourcedir = basedir + @resource_dir
|
552
|
+
libdir = basedir + @lib_dir
|
553
|
+
|
554
|
+
load_filter_libraries( libdir )
|
555
|
+
catalog = Manual::PageCatalog.new( sourcedir, layoutsdir )
|
556
|
+
|
557
|
+
# Declare the tasks outside the namespace that point in
|
558
|
+
task @name => "#@name:build"
|
559
|
+
task "clobber_#@name" => "#@name:clobber"
|
560
|
+
|
561
|
+
namespace( self.name ) do
|
562
|
+
setup_resource_copy_tasks( resourcedir, outputdir )
|
563
|
+
manual_pages = setup_page_conversion_tasks( sourcedir, outputdir, catalog )
|
564
|
+
|
565
|
+
desc "Build the manual"
|
566
|
+
task :build => [ :rdoc, :copy_resources, :generate_pages ]
|
567
|
+
|
568
|
+
task :clobber do
|
569
|
+
RakeFileUtils.verbose( $verbose ) do
|
570
|
+
rm_f manual_pages.to_a
|
571
|
+
end
|
572
|
+
remove_dir( outputdir ) if ( outputdir + '.buildtime' ).exist?
|
573
|
+
end
|
574
|
+
|
575
|
+
desc "Remove any previously-generated parts of the manual and rebuild it"
|
576
|
+
task :rebuild => [ :clobber, self.name ]
|
577
|
+
end
|
578
|
+
|
579
|
+
end # def define
|
580
|
+
|
581
|
+
|
271
582
|
### Load the filter libraries provided in the given +libdir+
|
272
583
|
def load_filter_libraries( libdir )
|
273
584
|
Pathname.glob( libdir + '*.rb' ) do |filterlib|
|
@@ -279,12 +590,11 @@ module Manual
|
|
279
590
|
|
280
591
|
### Set up the main HTML-generation task that will convert files in the given +sourcedir+ to
|
281
592
|
### HTML in the +outputdir+
|
282
|
-
def setup_page_conversion_tasks( sourcedir, outputdir,
|
283
|
-
source_glob = sourcedir + '**/*.page'
|
284
|
-
trace "Looking for sources that match: %s" % [ source_glob ]
|
593
|
+
def setup_page_conversion_tasks( sourcedir, outputdir, catalog )
|
285
594
|
|
286
|
-
#
|
287
|
-
|
595
|
+
# we need to figure out what HTML pages need to be generated so we can set up the
|
596
|
+
# dependency that causes the rule to be fired for each one when the task is invoked.
|
597
|
+
manual_sources = FileList[ catalog.path_index.keys.map {|pn| pn.to_s} ]
|
288
598
|
trace " found %d source files" % [ manual_sources.length ]
|
289
599
|
|
290
600
|
# Map .page files to their equivalent .html output
|
@@ -306,11 +616,12 @@ module Manual
|
|
306
616
|
outputdir.to_s
|
307
617
|
]) do |task|
|
308
618
|
|
309
|
-
source = Pathname.new( task.source )
|
310
|
-
target = Pathname.new( task.name )
|
619
|
+
source = Pathname.new( task.source )
|
620
|
+
target = Pathname.new( task.name )
|
311
621
|
log " #{ source } -> #{ target }"
|
312
622
|
|
313
|
-
page =
|
623
|
+
page = catalog.path_index[ source ]
|
624
|
+
#trace " page object is: %p" % [ page ]
|
314
625
|
|
315
626
|
target.dirname.mkpath
|
316
627
|
target.open( File::WRONLY|File::CREAT|File::TRUNC ) do |io|
|
@@ -318,67 +629,127 @@ module Manual
|
|
318
629
|
end
|
319
630
|
end
|
320
631
|
|
632
|
+
# Group all the manual page output files targets into a containing task
|
633
|
+
desc "Generate any pages of the manual that have changed"
|
634
|
+
task :generate_pages => manual_pages
|
321
635
|
return manual_pages
|
322
636
|
end
|
323
637
|
|
324
638
|
|
639
|
+
### Copy method for resources -- passed as a block to the various file tasks that copy
|
640
|
+
### resources to the output directory.
|
641
|
+
def copy_resource( task )
|
642
|
+
source = task.prerequisites[ 1 ]
|
643
|
+
target = task.name
|
644
|
+
|
645
|
+
when_writing do
|
646
|
+
log " #{source} -> #{target}"
|
647
|
+
mkpath File.dirname( target )
|
648
|
+
cp source, target, :verbose => $trace
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
|
325
653
|
### Set up a rule for copying files from the resources directory to the output dir.
|
326
654
|
def setup_resource_copy_tasks( resourcedir, outputdir )
|
655
|
+
resources = FileList[ resourcedir + '**/*.{js,css,png,gif,jpg,html}' ]
|
656
|
+
resources.exclude( /\.svn/ )
|
657
|
+
target_pathmap = "%%{%s,%s}p" % [ resourcedir, outputdir ]
|
658
|
+
targets = resources.pathmap( target_pathmap )
|
659
|
+
copier = self.method( :copy_resource ).to_proc
|
327
660
|
|
328
|
-
task
|
329
|
-
|
330
|
-
|
331
|
-
files = FileList[ resourcedir + '*' ]
|
332
|
-
files.exclude( /\.svn/ )
|
333
|
-
unless files.empty?
|
334
|
-
trace " Copying resource files: #{files}"
|
335
|
-
cp_r files, outputdir, :verbose => true
|
336
|
-
end
|
337
|
-
end
|
338
|
-
end
|
661
|
+
# Create a file task to copy each file to the output directory
|
662
|
+
resources.each_with_index do |resource, i|
|
663
|
+
file( targets[i] => [ outputdir.to_s, resource ], &copier )
|
339
664
|
end
|
665
|
+
|
666
|
+
# Now group all the resource file tasks into a containing task
|
667
|
+
desc "Copy manual resources to the output directory"
|
668
|
+
task :copy_resources => targets
|
340
669
|
end
|
341
670
|
|
671
|
+
end # class Manual::GenTask
|
672
|
+
|
673
|
+
end
|
342
674
|
|
343
|
-
### Set up the tasks for building the manual
|
344
|
-
def define
|
345
675
|
|
346
|
-
# Set up a description if the caller hasn't already defined one
|
347
|
-
unless Rake.application.last_comment
|
348
|
-
desc "Generate the manual"
|
349
|
-
end
|
350
676
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
677
|
+
### Task: manual generation
|
678
|
+
if MANUALDIR.exist?
|
679
|
+
MANUALOUTPUTDIR = MANUALDIR + 'output'
|
680
|
+
trace "Manual will be generated in: #{MANUALOUTPUTDIR}"
|
681
|
+
|
682
|
+
begin
|
683
|
+
directory MANUALOUTPUTDIR.to_s
|
684
|
+
|
685
|
+
Manual::GenTask.new do |manual|
|
686
|
+
manual.metadata.version = PKG_VERSION
|
687
|
+
manual.metadata.api_dir = RDOCDIR
|
688
|
+
manual.output_dir = MANUALOUTPUTDIR
|
689
|
+
manual.base_dir = MANUALDIR
|
690
|
+
manual.source_dir = 'src'
|
691
|
+
end
|
358
692
|
|
359
|
-
|
693
|
+
task :clobber_manual do
|
694
|
+
rmtree( MANUALOUTPUTDIR, :verbose => true )
|
695
|
+
end
|
360
696
|
|
361
|
-
|
362
|
-
|
363
|
-
|
697
|
+
rescue LoadError => err
|
698
|
+
task :no_manual do
|
699
|
+
$stderr.puts "Manual-generation tasks not defined: %s" % [ err.message ]
|
700
|
+
end
|
364
701
|
|
365
|
-
|
366
|
-
|
367
|
-
|
702
|
+
task :manual => :no_manual
|
703
|
+
task :clobber_manual => :no_manual
|
704
|
+
end
|
705
|
+
|
706
|
+
else
|
707
|
+
TEMPLATEDIR = RAKE_TASKDIR + 'manualdir'
|
708
|
+
|
709
|
+
if TEMPLATEDIR.exist?
|
710
|
+
|
711
|
+
desc "Create a manual for this project from a template"
|
712
|
+
task :manual do
|
713
|
+
log "No manual directory (#{MANUALDIR}) currently exists."
|
714
|
+
ask_for_confirmation( "Create a new manual directory tree from a template?" ) do
|
715
|
+
MANUALDIR.mkpath
|
368
716
|
|
369
|
-
|
717
|
+
%w[layouts lib output resources src].each do |dir|
|
718
|
+
FileUtils.mkpath( MANUALDIR + dir, :mode => 0755, :verbose => true, :noop => $dryrun )
|
719
|
+
end
|
370
720
|
|
371
|
-
|
372
|
-
|
373
|
-
|
721
|
+
Pathname.glob( TEMPLATEDIR + '**/*.{rb,css,png,js,erb,page}' ).each do |tmplfile|
|
722
|
+
trace "extname is: #{tmplfile.extname}"
|
723
|
+
|
724
|
+
# Render ERB files
|
725
|
+
if tmplfile.extname == '.erb'
|
726
|
+
rname = tmplfile.basename( '.erb' )
|
727
|
+
target = MANUALDIR + tmplfile.dirname.relative_path_from( TEMPLATEDIR ) + rname
|
728
|
+
template = ERB.new( tmplfile.read, nil, '<>' )
|
729
|
+
|
730
|
+
target.dirname.mkpath( :mode => 0755, :verbose => true, :noop => $dryrun ) unless
|
731
|
+
target.dirname.directory?
|
732
|
+
html = template.result( binding() )
|
733
|
+
log "generating #{target}: html => #{html[0,20]}"
|
734
|
+
|
735
|
+
target.open( File::WRONLY|File::CREAT|File::EXCL, 0644 ) do |fh|
|
736
|
+
fh.print( html )
|
737
|
+
end
|
738
|
+
|
739
|
+
# Just copy anything else
|
740
|
+
else
|
741
|
+
target = MANUALDIR + tmplfile.relative_path_from( TEMPLATEDIR )
|
742
|
+
FileUtils.mkpath target.dirname,
|
743
|
+
:mode => 0755, :verbose => true, :noop => $dryrun unless target.dirname.directory?
|
744
|
+
FileUtils.install tmplfile, target,
|
745
|
+
:mode => 0644, :verbose => true, :noop => $dryrun
|
374
746
|
end
|
375
|
-
remove_dir( outputdir ) if ( outputdir + '.buildtime' ).exist?
|
376
747
|
end
|
377
|
-
|
378
|
-
end
|
748
|
+
end
|
379
749
|
|
380
|
-
end #
|
381
|
-
|
382
|
-
end
|
383
|
-
|
750
|
+
end # task :manual
|
751
|
+
|
752
|
+
end
|
384
753
|
end
|
754
|
+
|
755
|
+
|