com web/php: Bring back the mega dropdown, toggled with "?" keyboard shortcut: include/footer.inc inc lude/header.inc include/layout.inc
include/shared-manua l.inc js/common.js js/ext/mousetrap.min.js styles /theme-base.css
| From: | Hannes Magnusson | Date: | Thu, 26 Dec 2013 21:34:43 +0000 |
| Subject: | com web/php: Bring back the mega dropdown, toggled with "?" keyboard shortcut: include/footer.inc inc lude/header.inc include/layout.inc include/shared-manua l.inc js/common.js js/ext/mousetrap.min.js styles /theme-base.css |
||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-17790@lists.php.net to get a copy of this message | ||
Commit: 36e805e147208636492473f469ee97114c41b2a4
Author: Hannes Magnusson <bjori@mongodb.com> Thu, 26 Dec 2013 13:34:43 -0800
Parents: f320ea32fd98178f05d64b784420dfc04bc1d30d
Branches: master
Link: http://git.php.net/?p=web/php.git;a=commitdiff;h=36e805e147208636492473f469ee97114c41b2a4
Log:
Bring back the mega dropdown, toggled with "?" keyboard shortcut
Changed paths:
M include/footer.inc
M include/header.inc
M include/layout.inc
M include/shared-manual.inc
M js/common.js
A js/ext/mousetrap.min.js
M styles/theme-base.css
diff --git a/include/footer.inc b/include/footer.inc index 24cffd8..f291b3e 100644 --- a/include/footer.inc +++ b/include/footer.inc @@ -41,7 +41,7 @@ <!-- External and third party libraries. --> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <?php - $jsfiles = array("ext/modernizr.js", "ext/hogan-2.0.0.min.js", "ext/typeahead.min.js", "search.js", "common.js"); + $jsfiles = array("ext/modernizr.js", "ext/hogan-2.0.0.min.js", "ext/typeahead.min.js", "ext/mousetrap.min.js", "search.js", "common.js"); foreach ($jsfiles as $filename) { $path = dirname(dirname(__FILE__)).'/js/'.$filename; echo '<script type="text/javascript" src="' . $MYSITE . 'cached.php?f=/js/'.$filename.'&t='.@filemtime($path).'"></script>'."\n"; diff --git a/include/header.inc b/include/header.inc index 798f314..e8f45fb 100755 --- a/include/header.inc +++ b/include/header.inc @@ -94,6 +94,7 @@ if ($config["cache"]) { </div> <div id="flash-message"></div> </nav> +<nav id="trick"><div><?php doc_toc("en") ?></div></nav> <?php if (!empty($config['breadcrumbs'])): ?> <div id="breadcrumbs"> diff --git a/include/layout.inc b/include/layout.inc index 3007e88..260d4ff 100644 --- a/include/layout.inc +++ b/include/layout.inc @@ -588,53 +588,42 @@ function doc_toc($lang) { } require dirname(__FILE__) . "/../manual/$lang/toc/index.inc"; -?> - <dl> - <dt><a href="/manual/">PHP Manual</a></dt> - <?php doc_toc_list($lang, $TOC, 'getting-started'); ?> - <?php doc_toc_title($lang, $TOC, 'install', 'dd'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'langref'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.basic-syntax'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.variables'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.operators'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.functions'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.oop5'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'funcref'); ?> - <?php doc_sub_entry($lang, 'refs.basic.vartype', 'book.array'); ?> - <?php doc_sub_entry($lang, 'refs.calendar', 'book.datetime'); ?> - <?php doc_sub_entry($lang, 'refs.basic.text', 'book.strings'); ?> - <?php doc_toc_title($lang, $TOC, 'faq'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'security'); ?> - <?php doc_sub_entry($lang, 'security', 'security.database'); ?> - <?php doc_sub_entry($lang, 'security', 'security.variables'); ?> - <?php doc_sub_entry($lang, 'faq', 'faq.passwords'); ?> - <?php doc_toc_title($lang, $TOC, 'appendices'); ?> - </dl> -<?php -} -function doc_sub_entry($lang, $file, $subfile, $elm = "dd") { - static $cache = array(); + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "getting-started"); + doc_toc_list($lang, $TOC, "langref"); + echo "</dl>\n"; + + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "security"); + doc_toc_list($lang, $TOC, "features"); + echo "</dl>\n"; + + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "funcref"); + echo "</dl>\n"; + + echo "<dl>\n"; + echo "<dt>Keyboard Shortcuts</dt>"; + echo "<dt>?</dt>\n"; + echo "<dd>This help</dd>\n"; + echo "<dt>j</dt>\n"; + echo "<dd>Next menu item</dd>\n"; + echo "<dt>k</dt>\n"; + echo "<dd>Previous menu item</dd>\n"; + echo "<dt>g p</dt>\n"; + echo "<dd>Previous man page</dd>\n"; + echo "<dt>g n</dt>\n"; + echo "<dd>Next man page</dd>\n"; + echo "<dt>G</dt>\n"; + echo "<dd>Scroll to bottom</dd>\n"; + echo "<dt>g g</dt>\n"; + echo "<dd>Scroll to top</dd>\n"; + echo "<dt>g h</dt>\n"; + echo "<dd>Goto homepage</dd>\n"; + echo "<dt>/</dt>\n"; + echo "<dd>Focus search box</dd>\n"; + echo "</dl>"; - if (isset($cache["$lang.$file"])) { - $TOC = $cache["$lang.$file"]; - } else { - include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc"; - } - - foreach($TOC as $entry) { - if (substr($entry[0], 0, strlen($subfile)) == $subfile) { - echo "\t<$elm><a href='/manual/$lang/{$entry[0]}'>{$entry[1]}</a></$elm>\n"; - } - } } function doc_toc_list($lang, $index, $file) { include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc"; @@ -655,10 +644,5 @@ function doc_toc_title($lang, $index, $file, $elm = "dt") { echo "<$elm><a href='/manual/$lang/$link'>$title</a></$elm>\n"; } - - - - - /* vim: set et ts=4 sw=4 ft=php: : */ diff --git a/include/shared-manual.inc b/include/shared-manual.inc index 5e0e428..bff2c32 100644 --- a/include/shared-manual.inc +++ b/include/shared-manual.inc @@ -361,20 +361,21 @@ function manual_setup($setup) { $menu[] = $last_item; } - $_SERVER["BASE_PAGE"] = "/manual/" . $setup["head"][1] . "/" . $setup["this"][0]; + $base = "manual/" . $setup["head"][1] . "/"; + $_SERVER["BASE_PAGE"] = "/" . $base . $setup["this"][0]; $config = array( "current" => "docs", "leftmenu" => $siblings, "breadcrumbs" => $menu, "meta-navigation" => array( - "contents" => $setup["home"][0], - "index" => $setup["up"][0], - "prev" => $setup["prev"][0], - "next" => $setup["next"][0], + "contents" => $base . $setup["home"][0], + "index" => $base . $setup["up"][0], + "prev" => $base . $setup["prev"][0], + "next" => $base . $setup["next"][0], ), - "lang" => $setup["head"][1], - "thispage" => $setup["this"][0], + "lang" => $base . $setup["head"][1], + "thispage" => $base . $setup["this"][0], "prev" => $setup["prev"], "next" => $setup["next"], ); diff --git a/js/common.js b/js/common.js index 6a254f1..98c9aa1 100755 --- a/js/common.js +++ b/js/common.js @@ -53,6 +53,73 @@ function scroll(target, interval) (function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,targ,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); /*}}}*/ +Mousetrap.bind('up up down down left right left right b a enter', function() { + $(".brand img").attr("src", "/images/php_konami.gif"); +}); +Mousetrap.bind("?", function() { + $.scrollTo(0, 10); + $("#trick").slideToggle(); +}); +/* +Mousetrap.bind("j", function() { + var n = window.pageYOffset + 20; + $.scrollTo(n, 10); +}); +Mousetrap.bind("k", function() { + var n = window.pageYOffset - 20; + $.scrollTo(n, 10); +}); +*/ +Mousetrap.bind("G", function() { + var n = $(document).height(); + $.scrollTo(n, 10); +}); +Mousetrap.bind("g h", function() { + window.location.href = "/"; +}); +Mousetrap.bind("g g", function() { + $.scrollTo(0, 10); +}); +Mousetrap.bind("g p", function() { + var link = $("link[rel=prev]").attr("href"); + if (link) { + window.location.href = link; + } +}); +Mousetrap.bind("g n", function() { + var link = $("link[rel=next]").attr("href"); + if (link) { + window.location.href = link; + } +}); +Mousetrap.bind("j", function() { + var fixedheader = 50; + var node = $(".layout-menu .current"); + if (node.next().length) { + var curr = node.toggleClass("current").next().toggleClass("current"); + $.scrollTo(curr.offset().top-fixedheader); + curr.children("a").first().focus().css({outline: "none"}); + } +}); +Mousetrap.bind("k", function() { + var fixedheader = 50; + var node = $(".layout-menu .current"); + if (node.prev().length) { + var curr = node.toggleClass("current").prev().toggleClass("current"); + $.scrollTo(curr.offset().top-fixedheader); + curr.children("a").first().focus().css({outline: "none"}); + } +}); +Mousetrap.bind("/", function(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + // internet explorer + e.returnValue = false; + } + $("input[type=search]").focus() +}); + $(window).load(function() { // Fire our scroll, webkit needs onload diff --git a/js/ext/mousetrap.min.js b/js/ext/mousetrap.min.js new file mode 100644 index 0000000..114a222 --- /dev/null +++ b/js/ext/mousetrap.min.js @@ -0,0 +1,9 @@ +/* mousetrap v1.4.6 craig.is/killing/mice */ +(function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var b=!1,d;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(g=0;g<l[a].length;++g)if(k= +l[a][g],!(!c&&k.seq&&n[k.seq]!=k.level||h!=k.action||("keypress"!=h||d.metaKey||d.ctrlKey)&&b.sort().join(",")!==k.modifiers.sort().join(","))){var m=c&&k.seq==c&&k.level==v;(!c&&k.combo==e||m)&&l[a].splice(g,1);f.push(k)}return f}function K(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function x(a,b,d,c){m.stopCallback(b,b.target||b.srcElement,d,c)||!1!==a(b,d)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation? +b.stopPropagation():b.cancelBubble=!0)}function y(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=A(a);b&&("keyup"==a.type&&z===b?z=!1:m.handleKey(b,K(a),a))}function w(a){return"shift"==a||"ctrl"==a||"alt"==a||"meta"==a}function L(a,b,d,c){function e(b){return function(){u=b;++n[a];clearTimeout(D);D=setTimeout(t,1E3)}}function v(b){x(d,b,a);"keyup"!==c&&(z=A(b));setTimeout(t,10)}for(var g=n[a]=0;g<b.length;++g){var f=g+1===b.length?v:e(c||E(b[g+1]).action);F(b[g],f,c,a,g)}}function E(a,b){var d, +c,e,f=[];d="+"===a?["+"]:a.split("+");for(e=0;e<d.length;++e)c=d[e],G[c]&&(c=G[c]),b&&"keypress"!=b&&H[c]&&(c=H[c],f.push("shift")),w(c)&&f.push(c);d=c;e=b;if(!e){if(!p){p={};for(var g in h)95<g&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}"keypress"==e&&f.length&&(e="keydown");return{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b;a=a.replace(/\s+/g," ");var f=a.split(" ");1<f.length?L(a,f,b,d):(d=E(a,d),l[d.key]=l[d.key]||[],C(d.key,d.modifiers,{type:d.action}, +c,a,e),l[d.key][c?"unshift":"push"]({callback:b,modifiers:d.modifiers,action:d.action,seq:c,level:e,combo:a}))}var h={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},B={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},H={"~":"`","!":"1", +"@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p,l={},q={},n={},D,z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y);s(r,"keydown",y);s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c<a.length;++c)F(a[c],b,d);return this}, +unbind:function(a,b){return m.bind(a,function(){},b)},trigger:function(a,b){if(q[a+":"+b])q[a+":"+b]({},a);return this},reset:function(){l={};q={};return this},stopCallback:function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable},handleKey:function(a,b,d){var c=C(a,b,d),e;b={};var f=0,g=!1;for(e=0;e<c.length;++e)c[e].seq&&(f=Math.max(f,c[e].level));for(e=0;e<c.length;++e)c[e].seq?c[e].level==f&&(g=!0, +b[c[e].seq]=1,x(c[e].callback,d,c[e].combo,c[e].seq)):g||x(c[e].callback,d,c[e].combo);c="keypress"==d.type&&I;d.type!=u||w(a)||c||t(b);I=g&&"keydown"==d.type}};J.Mousetrap=m;"function"===typeof define&&define.amd&&define(m)})(window,document); diff --git a/styles/theme-base.css b/styles/theme-base.css index e99155d..232a8a3 100755 --- a/styles/theme-base.css +++ b/styles/theme-base.css @@ -1587,6 +1587,7 @@ div.soft-deprecation-notice blockquote.sidebar { #intro .container, .navbar-inner, #breadcrumbs, + #trick div, #layout { width:1170px; } @@ -1595,6 +1596,7 @@ div.soft-deprecation-notice blockquote.sidebar { #intro .container, .navbar-inner, #breadcrumbs, + #trick div, #layout { width:1440px; } @@ -1732,6 +1734,38 @@ div.soft-deprecation-notice blockquote.sidebar { } } +#trick { + display: none; + background-color: #333; + border: .5em solid #9999CC; + border-right: 0; + border-left: 0; + border-top: 0; + height: 100%; + width: 100%; +} +#trick div { + margin: 0 auto; +} +#trick dt { + margin: 0 auto; +} +#trick dt, #trick dl { + color: #eee; + font-weight: bold; + margin-top: 1em; +} +#trick dl { + display: inline-block; + vertical-align: top; +} +#trick a { + color: #eee; + display: block; + padding: 2px; + color: #ccc; + border-bottom: none; +} /* {{{ Right-hand sidebar */ aside.tips { -moz-box-sizing:border-box;
diff --git a/include/footer.inc b/include/footer.inc index 24cffd8..f291b3e 100644 --- a/include/footer.inc +++ b/include/footer.inc @@ -41,7 +41,7 @@ <!-- External and third party libraries. --> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <?php - $jsfiles = array("ext/modernizr.js", "ext/hogan-2.0.0.min.js", "ext/typeahead.min.js", "search.js", "common.js"); + $jsfiles = array("ext/modernizr.js", "ext/hogan-2.0.0.min.js", "ext/typeahead.min.js", "ext/mousetrap.min.js", "search.js", "common.js"); foreach ($jsfiles as $filename) { $path = dirname(dirname(__FILE__)).'/js/'.$filename; echo '<script type="text/javascript" src="' . $MYSITE . 'cached.php?f=/js/'.$filename.'&t='.@filemtime($path).'"></script>'."\n"; diff --git a/include/header.inc b/include/header.inc index 798f314..e8f45fb 100755 --- a/include/header.inc +++ b/include/header.inc @@ -94,6 +94,7 @@ if ($config["cache"]) { </div> <div id="flash-message"></div> </nav> +<nav id="trick"><div><?php doc_toc("en") ?></div></nav> <?php if (!empty($config['breadcrumbs'])): ?> <div id="breadcrumbs"> diff --git a/include/layout.inc b/include/layout.inc index 3007e88..260d4ff 100644 --- a/include/layout.inc +++ b/include/layout.inc @@ -588,53 +588,42 @@ function doc_toc($lang) { } require dirname(__FILE__) . "/../manual/$lang/toc/index.inc"; -?> - <dl> - <dt><a href="/manual/">PHP Manual</a></dt> - <?php doc_toc_list($lang, $TOC, 'getting-started'); ?> - <?php doc_toc_title($lang, $TOC, 'install', 'dd'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'langref'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.basic-syntax'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.variables'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.operators'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.functions'); ?> - <?php doc_sub_entry($lang, 'langref', 'language.oop5'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'funcref'); ?> - <?php doc_sub_entry($lang, 'refs.basic.vartype', 'book.array'); ?> - <?php doc_sub_entry($lang, 'refs.calendar', 'book.datetime'); ?> - <?php doc_sub_entry($lang, 'refs.basic.text', 'book.strings'); ?> - <?php doc_toc_title($lang, $TOC, 'faq'); ?> - </dl> - - <dl> - <?php doc_toc_title($lang, $TOC, 'security'); ?> - <?php doc_sub_entry($lang, 'security', 'security.database'); ?> - <?php doc_sub_entry($lang, 'security', 'security.variables'); ?> - <?php doc_sub_entry($lang, 'faq', 'faq.passwords'); ?> - <?php doc_toc_title($lang, $TOC, 'appendices'); ?> - </dl> -<?php -} -function doc_sub_entry($lang, $file, $subfile, $elm = "dd") { - static $cache = array(); + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "getting-started"); + doc_toc_list($lang, $TOC, "langref"); + echo "</dl>\n"; + + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "security"); + doc_toc_list($lang, $TOC, "features"); + echo "</dl>\n"; + + echo "<dl>\n"; + doc_toc_list($lang, $TOC, "funcref"); + echo "</dl>\n"; + + echo "<dl>\n"; + echo "<dt>Keyboard Shortcuts</dt>"; + echo "<dt>?</dt>\n"; + echo "<dd>This help</dd>\n"; + echo "<dt>j</dt>\n"; + echo "<dd>Next menu item</dd>\n"; + echo "<dt>k</dt>\n"; + echo "<dd>Previous menu item</dd>\n"; + echo "<dt>g p</dt>\n"; + echo "<dd>Previous man page</dd>\n"; + echo "<dt>g n</dt>\n"; + echo "<dd>Next man page</dd>\n"; + echo "<dt>G</dt>\n"; + echo "<dd>Scroll to bottom</dd>\n"; + echo "<dt>g g</dt>\n"; + echo "<dd>Scroll to top</dd>\n"; + echo "<dt>g h</dt>\n"; + echo "<dd>Goto homepage</dd>\n"; + echo "<dt>/</dt>\n"; + echo "<dd>Focus search box</dd>\n"; + echo "</dl>"; - if (isset($cache["$lang.$file"])) { - $TOC = $cache["$lang.$file"]; - } else { - include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc"; - } - - foreach($TOC as $entry) { - if (substr($entry[0], 0, strlen($subfile)) == $subfile) { - echo "\t<$elm><a href='/manual/$lang/{$entry[0]}'>{$entry[1]}</a></$elm>\n"; - } - } } function doc_toc_list($lang, $index, $file) { include dirname(__FILE__) . "/../manual/$lang/toc/$file.inc"; @@ -655,10 +644,5 @@ function doc_toc_title($lang, $index, $file, $elm = "dt") { echo "<$elm><a href='/manual/$lang/$link'>$title</a></$elm>\n"; } - - - - - /* vim: set et ts=4 sw=4 ft=php: : */ diff --git a/include/shared-manual.inc b/include/shared-manual.inc index 5e0e428..bff2c32 100644 --- a/include/shared-manual.inc +++ b/include/shared-manual.inc @@ -361,20 +361,21 @@ function manual_setup($setup) { $menu[] = $last_item; } - $_SERVER["BASE_PAGE"] = "/manual/" . $setup["head"][1] . "/" . $setup["this"][0]; + $base = "manual/" . $setup["head"][1] . "/"; + $_SERVER["BASE_PAGE"] = "/" . $base . $setup["this"][0]; $config = array( "current" => "docs", "leftmenu" => $siblings, "breadcrumbs" => $menu, "meta-navigation" => array( - "contents" => $setup["home"][0], - "index" => $setup["up"][0], - "prev" => $setup["prev"][0], - "next" => $setup["next"][0], + "contents" => $base . $setup["home"][0], + "index" => $base . $setup["up"][0], + "prev" => $base . $setup["prev"][0], + "next" => $base . $setup["next"][0], ), - "lang" => $setup["head"][1], - "thispage" => $setup["this"][0], + "lang" => $base . $setup["head"][1], + "thispage" => $base . $setup["this"][0], "prev" => $setup["prev"], "next" => $setup["next"], ); diff --git a/js/common.js b/js/common.js index 6a254f1..98c9aa1 100755 --- a/js/common.js +++ b/js/common.js @@ -53,6 +53,73 @@ function scroll(target, interval) (function($){var h=$.scrollTo=function(a,b,c){$(window).scrollTo(a,b,c)};h.defaults={axis:'xy',duration:parseFloat($.fn.jquery)>=1.3?0:1,limit:true};h.window=function(a){return $(window)._scrollable()};$.fn._scrollable=function(){return this.map(function(){var a=this,isWin=!a.nodeName||$.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!isWin)return a;var b=(a.contentWindow||a).document||a.ownerDocument||a;return/webkit/i.test(navigator.userAgent)||b.compatMode=='BackCompat'?b.body:b.documentElement})};$.fn.scrollTo=function(e,f,g){if(typeof f=='object'){g=f;f=0}if(typeof g=='function')g={onAfter:g};if(e=='max')e=9e9;g=$.extend({},h.defaults,g);f=f||g.duration;g.queue=g.queue&&g.axis.length>1;if(g.queue)f/=2;g.offset=both(g.offset);g.over=both(g.over);return this._scrollable().each(function(){if(e==null)return;var d=this,$elem=$(d),targ=e,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case'number':case'string':if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(targ)){targ=both(targ);break}targ=$(targ,this);if(!targ.length)return;case'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset()}$.each(g.axis.split(''),function(i,a){var b=a=='x'?'Left':'Top',pos=b.toLowerCase(),key='scroll'+b,old=d[key],max=h.max(d,a);if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(g.margin){attr[key]-=parseInt(targ.css('margin'+b))||0;attr[key]-=parseInt(targ.css('border'+b+'Width'))||0}attr[key]+=g.offset[pos]||0;if(g.over[pos])attr[key]+=targ[a=='x'?'width':'height']()*g.over[pos]}else{var c=targ[pos];attr[key]=c.slice&&c.slice(-1)=='%'?parseFloat(c)/100*max:c}if(g.limit&&/^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max);if(!i&&g.queue){if(old!=attr[key])animate(g.onAfterFirst);delete attr[key]}});animate(g.onAfter);function animate(a){$elem.animate(attr,f,g.easing,a&&function(){a.call(this,targ,g)})}}).end()};h.max=function(a,b){var c=b=='x'?'Width':'Height',scroll='scroll'+c;if(!$(a).is('html,body'))return a[scroll]-$(a)[c.toLowerCase()]();var d='client'+c,html=a.ownerDocument.documentElement,body=a.ownerDocument.body;return Math.max(html[scroll],body[scroll])-Math.min(html[d],body[d])};function both(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); /*}}}*/ +Mousetrap.bind('up up down down left right left right b a enter', function() { + $(".brand img").attr("src", "/images/php_konami.gif"); +}); +Mousetrap.bind("?", function() { + $.scrollTo(0, 10); + $("#trick").slideToggle(); +}); +/* +Mousetrap.bind("j", function() { + var n = window.pageYOffset + 20; + $.scrollTo(n, 10); +}); +Mousetrap.bind("k", function() { + var n = window.pageYOffset - 20; + $.scrollTo(n, 10); +}); +*/ +Mousetrap.bind("G", function() { + var n = $(document).height(); + $.scrollTo(n, 10); +}); +Mousetrap.bind("g h", function() { + window.location.href = "/"; +}); +Mousetrap.bind("g g", function() { + $.scrollTo(0, 10); +}); +Mousetrap.bind("g p", function() { + var link = $("link[rel=prev]").attr("href"); + if (link) { + window.location.href = link; + } +}); +Mousetrap.bind("g n", function() { + var link = $("link[rel=next]").attr("href"); + if (link) { + window.location.href = link; + } +}); +Mousetrap.bind("j", function() { + var fixedheader = 50; + var node = $(".layout-menu .current"); + if (node.next().length) { + var curr = node.toggleClass("current").next().toggleClass("current"); + $.scrollTo(curr.offset().top-fixedheader); + curr.children("a").first().focus().css({outline: "none"}); + } +}); +Mousetrap.bind("k", function() { + var fixedheader = 50; + var node = $(".layout-menu .current"); + if (node.prev().length) { + var curr = node.toggleClass("current").prev().toggleClass("current"); + $.scrollTo(curr.offset().top-fixedheader); + curr.children("a").first().focus().css({outline: "none"}); + } +}); +Mousetrap.bind("/", function(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + // internet explorer + e.returnValue = false; + } + $("input[type=search]").focus() +}); + $(window).load(function() { // Fire our scroll, webkit needs onload diff --git a/js/ext/mousetrap.min.js b/js/ext/mousetrap.min.js new file mode 100644 index 0000000..114a222 --- /dev/null +++ b/js/ext/mousetrap.min.js @@ -0,0 +1,9 @@ +/* mousetrap v1.4.6 craig.is/killing/mice */ +(function(J,r,f){function s(a,b,d){a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent("on"+b,d)}function A(a){if("keypress"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return h[a.which]?h[a.which]:B[a.which]?B[a.which]:String.fromCharCode(a.which).toLowerCase()}function t(a){a=a||{};var b=!1,d;for(d in n)a[d]?b=!0:n[d]=0;b||(u=!1)}function C(a,b,d,c,e,v){var g,k,f=[],h=d.type;if(!l[a])return[];"keyup"==h&&w(a)&&(b=[a]);for(g=0;g<l[a].length;++g)if(k= +l[a][g],!(!c&&k.seq&&n[k.seq]!=k.level||h!=k.action||("keypress"!=h||d.metaKey||d.ctrlKey)&&b.sort().join(",")!==k.modifiers.sort().join(","))){var m=c&&k.seq==c&&k.level==v;(!c&&k.combo==e||m)&&l[a].splice(g,1);f.push(k)}return f}function K(a){var b=[];a.shiftKey&&b.push("shift");a.altKey&&b.push("alt");a.ctrlKey&&b.push("ctrl");a.metaKey&&b.push("meta");return b}function x(a,b,d,c){m.stopCallback(b,b.target||b.srcElement,d,c)||!1!==a(b,d)||(b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation? +b.stopPropagation():b.cancelBubble=!0)}function y(a){"number"!==typeof a.which&&(a.which=a.keyCode);var b=A(a);b&&("keyup"==a.type&&z===b?z=!1:m.handleKey(b,K(a),a))}function w(a){return"shift"==a||"ctrl"==a||"alt"==a||"meta"==a}function L(a,b,d,c){function e(b){return function(){u=b;++n[a];clearTimeout(D);D=setTimeout(t,1E3)}}function v(b){x(d,b,a);"keyup"!==c&&(z=A(b));setTimeout(t,10)}for(var g=n[a]=0;g<b.length;++g){var f=g+1===b.length?v:e(c||E(b[g+1]).action);F(b[g],f,c,a,g)}}function E(a,b){var d, +c,e,f=[];d="+"===a?["+"]:a.split("+");for(e=0;e<d.length;++e)c=d[e],G[c]&&(c=G[c]),b&&"keypress"!=b&&H[c]&&(c=H[c],f.push("shift")),w(c)&&f.push(c);d=c;e=b;if(!e){if(!p){p={};for(var g in h)95<g&&112>g||h.hasOwnProperty(g)&&(p[h[g]]=g)}e=p[d]?"keydown":"keypress"}"keypress"==e&&f.length&&(e="keydown");return{key:c,modifiers:f,action:e}}function F(a,b,d,c,e){q[a+":"+d]=b;a=a.replace(/\s+/g," ");var f=a.split(" ");1<f.length?L(a,f,b,d):(d=E(a,d),l[d.key]=l[d.key]||[],C(d.key,d.modifiers,{type:d.action}, +c,a,e),l[d.key][c?"unshift":"push"]({callback:b,modifiers:d.modifiers,action:d.action,seq:c,level:e,combo:a}))}var h={8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"ins",46:"del",91:"meta",93:"meta",224:"meta"},B={106:"*",107:"+",109:"-",110:".",111:"/",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},H={"~":"`","!":"1", +"@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=",":":";",'"':"'","<":",",">":".","?":"/","|":"\\"},G={option:"alt",command:"meta","return":"enter",escape:"esc",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?"meta":"ctrl"},p,l={},q={},n={},D,z=!1,I=!1,u=!1;for(f=1;20>f;++f)h[111+f]="f"+f;for(f=0;9>=f;++f)h[f+96]=f;s(r,"keypress",y);s(r,"keydown",y);s(r,"keyup",y);var m={bind:function(a,b,d){a=a instanceof Array?a:[a];for(var c=0;c<a.length;++c)F(a[c],b,d);return this}, +unbind:function(a,b){return m.bind(a,function(){},b)},trigger:function(a,b){if(q[a+":"+b])q[a+":"+b]({},a);return this},reset:function(){l={};q={};return this},stopCallback:function(a,b){return-1<(" "+b.className+" ").indexOf(" mousetrap ")?!1:"INPUT"==b.tagName||"SELECT"==b.tagName||"TEXTAREA"==b.tagName||b.isContentEditable},handleKey:function(a,b,d){var c=C(a,b,d),e;b={};var f=0,g=!1;for(e=0;e<c.length;++e)c[e].seq&&(f=Math.max(f,c[e].level));for(e=0;e<c.length;++e)c[e].seq?c[e].level==f&&(g=!0, +b[c[e].seq]=1,x(c[e].callback,d,c[e].combo,c[e].seq)):g||x(c[e].callback,d,c[e].combo);c="keypress"==d.type&&I;d.type!=u||w(a)||c||t(b);I=g&&"keydown"==d.type}};J.Mousetrap=m;"function"===typeof define&&define.amd&&define(m)})(window,document); diff --git a/styles/theme-base.css b/styles/theme-base.css index e99155d..232a8a3 100755 --- a/styles/theme-base.css +++ b/styles/theme-base.css @@ -1587,6 +1587,7 @@ div.soft-deprecation-notice blockquote.sidebar { #intro .container, .navbar-inner, #breadcrumbs, + #trick div, #layout { width:1170px; } @@ -1595,6 +1596,7 @@ div.soft-deprecation-notice blockquote.sidebar { #intro .container, .navbar-inner, #breadcrumbs, + #trick div, #layout { width:1440px; } @@ -1732,6 +1734,38 @@ div.soft-deprecation-notice blockquote.sidebar { } } +#trick { + display: none; + background-color: #333; + border: .5em solid #9999CC; + border-right: 0; + border-left: 0; + border-top: 0; + height: 100%; + width: 100%; +} +#trick div { + margin: 0 auto; +} +#trick dt { + margin: 0 auto; +} +#trick dt, #trick dl { + color: #eee; + font-weight: bold; + margin-top: 1em; +} +#trick dl { + display: inline-block; + vertical-align: top; +} +#trick a { + color: #eee; + display: block; + padding: 2px; + color: #ccc; + border-bottom: none; +} /* {{{ Right-hand sidebar */ aside.tips { -moz-box-sizing:border-box;