Add keyboard shortcut to toggle RTL mode

This commit is contained in:
Frédéric Guillot 2014-12-23 22:13:23 -05:00
parent c6ed11c116
commit 5690f91fb7
12 changed files with 56 additions and 26 deletions

40
assets/js/all.min.js vendored
View File

@ -1,20 +1,20 @@
var Miniflux={};Miniflux.App=function(){return{BlinkIcon:function(){var e=document.querySelectorAll(".loading-icon");[].forEach.call(e,function(c){c.classList.toggle("loading-icon-blink")})},Run:function(){Miniflux.Event.ListenKeyboardEvents();Miniflux.Event.ListenMouseEvents()}}}();
Miniflux.Feed=function(){function e(d){if(d=document.getElementById("loading-feed-"+d))d.appendChild(document.createTextNode("\u2600")),d.classList.add("loading-icon-blink");f||(f=setInterval(Miniflux.App.BlinkIcon,500))}function c(){for(var d=document.getElementsByTagName("a"),k=0,a=d.length;k<a;k++){var c=d[k].getAttribute("data-feed-id");c&&b.push(parseInt(c))}}var b=[],a=[],f;return{Update:function(d,b){e(d);var c=new XMLHttpRequest;c.onload=function(){var c=document.getElementById("loading-feed-"+
d);c&&(c.innerHTML="");if(c=document.getElementById("last-checked-feed-"+d))c.innerHTML=c.getAttribute("data-after-update");try{var a=JSON.parse(this.responseText);if(a.result){var g=a.items_count,e=document.getElementById("items-count-"+d);e&&(e.innerHTML=g.items_unread+"/"+g.items_total)}b&&b(a)}catch(f){}};c.open("POST","?action=refresh-feed&feed_id="+d,!0);c.send()},UpdateAll:function(){c();var d=setInterval(function(){for(;0<b.length&&5>a.length;){var c=b.shift();a.push(c);Miniflux.Feed.Update(c,
function(c){c=a.indexOf(c.feed_id);0<=c&&a.splice(c,1);0==b.length&&0==a.length&&(clearInterval(d),clearInterval(f),window.location.href="?action=unread")})}},100)}}}();
Miniflux.Item=function(){function e(d){return item_id=d.getAttribute("data-item-id")}function c(d){if(d&&d.hasAttribute("data-reverse-label")){var b=d.innerHTML;d.innerHTML=d.getAttribute("data-reverse-label");d.setAttribute("data-reverse-label",b)}}function b(d){"mouse"!==Miniflux.Event.lastEventType&&Miniflux.Nav.SelectNextItem();d.parentNode.removeChild(d);var b=document.getElementById("page-counter");if(b){d=d.getAttribute("data-item-page");var c=parseInt(b.textContent,10)-1,a=document.getElementsByTagName("article");
if(0===c||0===a.length)window.location=location.href;b.textContent=c;switch(d){case "unread":document.title="Miniflux ("+c+")";document.getElementById("nav-counter").textContent=c;break;case "feed-items":document.title="("+c+") "+b.parentNode.firstChild.nodeValue;break;default:document.title=b.parentNode.firstChild.nodeValue+" ("+c+")"}}}function a(d){var a=e(d),g=new XMLHttpRequest;g.onload=function(){if(Miniflux.Nav.IsListing())if(d.getAttribute("data-hide"))b(d);else{d.setAttribute("data-item-status",
"read");var a=d.querySelector("a.mark");c(a);(a=d.querySelector("a.mark"))&&a.setAttribute("data-action","mark-unread")}};g.open("POST","?action=mark-item-read&id="+a,!0);g.send()}function f(d){var a=e(d),g=new XMLHttpRequest;g.onload=function(){if(Miniflux.Nav.IsListing())if(d.getAttribute("data-hide"))b(d);else{d.setAttribute("data-item-status","unread");var a=d.querySelector("a.mark");c(a);(a=d.querySelector("a.mark"))&&a.setAttribute("data-action","mark-read")}};g.open("POST","?action=mark-item-unread&id="+
a,!0);g.send()}return{MarkAsRead:a,MarkAsUnread:f,MarkAsRemoved:function(d){var c=e(d),a=new XMLHttpRequest;a.onload=function(){Miniflux.Nav.IsListing()&&b(d)};a.open("POST","?action=mark-item-removed&id="+c,!0);a.send()},SwitchBookmark:function(d){var a=e(d),g="1"===d.getAttribute("data-item-bookmark")?"0":"1",h=new XMLHttpRequest;h.onload=function(){if(Miniflux.Nav.IsListing()&&"bookmarks"===d.getAttribute("data-item-page"))b(d);else if(d.setAttribute("data-item-bookmark",g),Miniflux.Nav.IsListing()){var a=
d.querySelector("a.bookmark");c(a)}else if((a=d.querySelector("a.bookmark-icon"))&&a.hasAttribute("data-reverse-title")){var k=a.getAttribute("title");a.setAttribute("title",a.getAttribute("data-reverse-title"));a.setAttribute("data-reverse-title",k)}};h.open("POST","?action=bookmark&id="+a+"&value="+g,!0);h.send()},SwitchStatus:function(d){var b=d.getAttribute("data-item-status");"read"===b?f(d):"unread"===b&&a(d)},Show:function(a){(a=a.querySelector("a.show"))&&a.click()},OpenOriginal:function(b){var c=
b.querySelector("a.original");c&&("unread"===b.getAttribute("data-item-status")&&a(b),c.removeAttribute("data-action"),c.click())},DownloadContent:function(a){var b=document.getElementById("download-item");if(b){a=e(a);var c=b.getAttribute("data-before-message"),h=document.createElement("span");h.appendChild(document.createTextNode("\u2600"));h.className="loading-icon";b.innerHTML="";b.className="downloading";b.appendChild(h);b.appendChild(document.createTextNode(" "+c));var f=setInterval(Miniflux.App.BlinkIcon,
250),l=new XMLHttpRequest;l.onload=function(){var a=JSON.parse(l.responseText);clearInterval(f);if(a.result){var c=document.getElementById("item-content");c&&(c.innerHTML=a.content);b&&(a=b.getAttribute("data-after-message"),b.innerHTML="",b.appendChild(document.createTextNode(" "+a)))}else b&&(a=b.getAttribute("data-failure-message"),b.innerHTML="",b.appendChild(document.createTextNode(" "+a)))};l.open("POST","?action=download-item&id="+a,!0);l.send()}},MarkListingAsRead:function(b){for(var a=document.getElementsByTagName("article"),
c=[],f=0,m=a.length;f<m;f++)c.push(e(a[f]));a=new XMLHttpRequest;a.onload=function(){window.location.href=b};a.open("POST","?action=mark-items-as-read",!0);a.send(JSON.stringify(c))}}}();
Miniflux.Event=function(){var e=[];return{lastEventType:"",ListenMouseEvents:function(){document.onclick=function(c){var b=c.target.getAttribute("data-action");if(b){Miniflux.Event.lastEventType="mouse";var a;a:{for(element=c.target;element&&element.parentNode;)if(element=element.parentNode,element.tagName&&"article"===element.tagName.toLowerCase()){a=element;break a}a=null}switch(b){case "refresh-all":c.preventDefault();Miniflux.Feed.UpdateAll();break;case "refresh-feed":c.preventDefault();Miniflux.Feed.Update(c.target.getAttribute("data-feed-id"));
break;case "mark-read":c.preventDefault();Miniflux.Item.MarkAsRead(a);break;case "mark-unread":c.preventDefault();Miniflux.Item.MarkAsUnread(a);break;case "mark-removed":c.preventDefault();Miniflux.Item.MarkAsRemoved(a);break;case "bookmark":c.preventDefault();Miniflux.Item.SwitchBookmark(a);break;case "download-item":c.preventDefault();Miniflux.Item.DownloadContent(a);break;case "original-link":c.preventDefault();Miniflux.Item.OpenOriginal(a);break;case "mark-all-read":c.preventDefault();Miniflux.Item.MarkListingAsRead("?action=unread");
break;case "mark-feed-read":c.preventDefault(),Miniflux.Item.MarkListingAsRead("?action=feed-items&feed_id="+c.target.getAttribute("data-feed-id"))}}}},ListenKeyboardEvents:function(){document.onkeypress=function(c){if(63==c.keyCode||!(c.ctrlKey||c.shiftKey||c.altKey||c.metaKey)){var b=c.target||c.srcElement;if("INPUT"!=b.tagName&&"TEXTAREA"!=b.tagName)if(Miniflux.Event.lastEventType="keyboard",e.push(c.keyCode||c.which),103===e[0])switch(e[1]){case void 0:break;case 117:window.location.href="?action=unread";
e=[];break;case 98:window.location.href="?action=bookmarks";e=[];break;case 104:window.location.href="?action=history";e=[];break;case 115:window.location.href="?action=feeds";e=[];break;case 112:window.location.href="?action=config";e=[];break;default:e=[]}else switch(e=[],b=document.getElementById("current-item"),c.keyCode||c.which){case 100:Miniflux.Item.DownloadContent(b);break;case 112:case 107:Miniflux.Nav.SelectPreviousItem();break;case 110:case 106:Miniflux.Nav.SelectNextItem();break;case 118:Miniflux.Item.OpenOriginal(b);
break;case 111:Miniflux.Item.Show(b);break;case 109:Miniflux.Item.SwitchStatus(b);break;case 102:Miniflux.Item.SwitchBookmark(b);break;case 104:Miniflux.Nav.OpenPreviousPage();break;case 108:Miniflux.Nav.OpenNextPage();break;case 114:Miniflux.Feed.UpdateAll();break;case 63:Miniflux.Nav.ShowHelp()}}}}}}();
Miniflux.Nav=function(){function e(b){var a=pageYOffset+document.documentElement.clientHeight;(0>a-(b.offsetTop+b.offsetHeight)||a-b.offsetTop>document.documentElement.clientHeight)&&window.scrollTo(0,b.offsetTop-10)}function c(){return document.getElementById("listing")?!0:!1}return{OpenNextPage:function(){var b=document.getElementById("next-page");b&&b.click()},OpenPreviousPage:function(){var b=document.getElementById("previous-page");b&&b.click()},SelectNextItem:function(){var b=document.getElementById("next-item");
if(b)b.click();else if(c())if(b=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var a=0,f=b.length;a<f;a++){if("current-item"===b[a].id){a+1<f&&(b[a].id="item-"+b[a].getAttribute("data-item-id"),b[a+1].id="current-item",e(b[a+1]));break}}else b[0].id="current-item",e(b[0])},SelectPreviousItem:function(){var b=document.getElementById("previous-item");if(b)b.click();else if(c())if(b=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var a=
b.length-1;0<=a;a--){if("current-item"===b[a].id){0<=a-1&&(b[a].id="item-"+b[a].getAttribute("data-item-id"),b[a-1].id="current-item",e(b[a-1]));break}}else b[b.length-1].id="current-item",e(b[b.length-1])},ShowHelp:function(){open("?action=show-help","Help","width=320,height=450,location=no,scrollbars=no,status=no,toolbar=no")},IsListing:c}}();Miniflux.App.Run();
var Miniflux={};Miniflux.App=function(){return{BlinkIcon:function(){var e=document.querySelectorAll(".loading-icon");[].forEach.call(e,function(d){d.classList.toggle("loading-icon-blink")})},Run:function(){Miniflux.Event.ListenKeyboardEvents();Miniflux.Event.ListenMouseEvents()}}}();
Miniflux.Feed=function(){function e(c){if(c=document.getElementById("loading-feed-"+c))c.appendChild(document.createTextNode("\u2600")),c.classList.add("loading-icon-blink");f||(f=setInterval(Miniflux.App.BlinkIcon,500))}function d(){for(var c=document.getElementsByTagName("a"),h=0,g=c.length;h<g;h++){var a=c[h].getAttribute("data-feed-id");a&&b.push(parseInt(a))}}var b=[],a=[],f;return{Update:function(c,b){e(c);var a=new XMLHttpRequest;a.onload=function(){var a=document.getElementById("loading-feed-"+
c);a&&(a.innerHTML="");if(a=document.getElementById("last-checked-feed-"+c))a.innerHTML=a.getAttribute("data-after-update");try{var d=JSON.parse(this.responseText);if(d.result){var g=d.items_count,e=document.getElementById("items-count-"+c);e&&(e.innerHTML=g.items_unread+"/"+g.items_total)}b&&b(d)}catch(f){}};a.open("POST","?action=refresh-feed&feed_id="+c,!0);a.send()},UpdateAll:function(){d();var c=setInterval(function(){for(;0<b.length&&5>a.length;){var h=b.shift();a.push(h);Miniflux.Feed.Update(h,
function(h){h=a.indexOf(h.feed_id);0<=h&&a.splice(h,1);0==b.length&&0==a.length&&(clearInterval(c),clearInterval(f),window.location.href="?action=unread")})}},100)}}}();
Miniflux.Item=function(){function e(c){return item_id=c.getAttribute("data-item-id")}function d(c){if(c&&c.hasAttribute("data-reverse-label")){var b=c.innerHTML;c.innerHTML=c.getAttribute("data-reverse-label");c.setAttribute("data-reverse-label",b)}}function b(c){"mouse"!==Miniflux.Event.lastEventType&&Miniflux.Nav.SelectNextItem();c.parentNode.removeChild(c);var b=document.getElementById("page-counter");if(b){c=c.getAttribute("data-item-page");var a=parseInt(b.textContent,10)-1,d=document.getElementsByTagName("article");
if(0===a||0===d.length)window.location=location.href;b.textContent=a;switch(c){case "unread":document.title="Miniflux ("+a+")";document.getElementById("nav-counter").textContent=a;break;case "feed-items":document.title="("+a+") "+b.parentNode.firstChild.nodeValue;break;default:document.title=b.parentNode.firstChild.nodeValue+" ("+a+")"}}}function a(c){var a=e(c),g=new XMLHttpRequest;g.onload=function(){if(Miniflux.Nav.IsListing())if(c.getAttribute("data-hide"))b(c);else{c.setAttribute("data-item-status",
"read");var a=c.querySelector("a.mark");d(a);(a=c.querySelector("a.mark"))&&a.setAttribute("data-action","mark-unread")}};g.open("POST","?action=mark-item-read&id="+a,!0);g.send()}function f(c){var a=e(c),g=new XMLHttpRequest;g.onload=function(){if(Miniflux.Nav.IsListing())if(c.getAttribute("data-hide"))b(c);else{c.setAttribute("data-item-status","unread");var a=c.querySelector("a.mark");d(a);(a=c.querySelector("a.mark"))&&a.setAttribute("data-action","mark-read")}};g.open("POST","?action=mark-item-unread&id="+
a,!0);g.send()}return{MarkAsRead:a,MarkAsUnread:f,MarkAsRemoved:function(c){var a=e(c),d=new XMLHttpRequest;d.onload=function(){Miniflux.Nav.IsListing()&&b(c)};d.open("POST","?action=mark-item-removed&id="+a,!0);d.send()},SwitchBookmark:function(c){var a=e(c),g="1"===c.getAttribute("data-item-bookmark")?"0":"1",k=new XMLHttpRequest;k.onload=function(){if(Miniflux.Nav.IsListing()&&"bookmarks"===c.getAttribute("data-item-page"))b(c);else if(c.setAttribute("data-item-bookmark",g),Miniflux.Nav.IsListing()){var a=
c.querySelector("a.bookmark");d(a)}else if((a=c.querySelector("a.bookmark-icon"))&&a.hasAttribute("data-reverse-title")){var h=a.getAttribute("title");a.setAttribute("title",a.getAttribute("data-reverse-title"));a.setAttribute("data-reverse-title",h)}};k.open("POST","?action=bookmark&id="+a+"&value="+g,!0);k.send()},SwitchStatus:function(c){var b=c.getAttribute("data-item-status");"read"===b?f(c):"unread"===b&&a(c)},Show:function(a){(a=a.querySelector("a.show"))&&a.click()},OpenOriginal:function(b){var d=
b.querySelector("a.original");d&&("unread"===b.getAttribute("data-item-status")&&a(b),d.removeAttribute("data-action"),d.click())},DownloadContent:function(a){var b=document.getElementById("download-item");if(b){a=e(a);var d=b.getAttribute("data-before-message"),k=document.createElement("span");k.appendChild(document.createTextNode("\u2600"));k.className="loading-icon";b.innerHTML="";b.className="downloading";b.appendChild(k);b.appendChild(document.createTextNode(" "+d));var f=setInterval(Miniflux.App.BlinkIcon,
250),l=new XMLHttpRequest;l.onload=function(){var a=JSON.parse(l.responseText);clearInterval(f);if(a.result){var c=document.getElementById("item-content");c&&(c.innerHTML=a.content);b&&(a=b.getAttribute("data-after-message"),b.innerHTML="",b.appendChild(document.createTextNode(" "+a)))}else b&&(a=b.getAttribute("data-failure-message"),b.innerHTML="",b.appendChild(document.createTextNode(" "+a)))};l.open("POST","?action=download-item&id="+a,!0);l.send()}},MarkListingAsRead:function(a){for(var b=document.getElementsByTagName("article"),
d=[],f=0,m=b.length;f<m;f++)d.push(e(b[f]));b=new XMLHttpRequest;b.onload=function(){window.location.href=a};b.open("POST","?action=mark-items-as-read",!0);b.send(JSON.stringify(d))},ToggleRTLMode:function(){for(var a=["#current-item h1","#item-content","#current-item h2","#current-item .preview"],b=0;b<a.length;b++){var d=document.querySelector(a[b]);d&&(d.dir=""==d.dir?"rtl":"")}}}}();
Miniflux.Event=function(){var e=[];return{lastEventType:"",ListenMouseEvents:function(){document.onclick=function(d){var b=d.target.getAttribute("data-action");if(b){Miniflux.Event.lastEventType="mouse";var a;a:{for(element=d.target;element&&element.parentNode;)if(element=element.parentNode,element.tagName&&"article"===element.tagName.toLowerCase()){a=element;break a}a=null}switch(b){case "refresh-all":d.preventDefault();Miniflux.Feed.UpdateAll();break;case "refresh-feed":d.preventDefault();Miniflux.Feed.Update(d.target.getAttribute("data-feed-id"));
break;case "mark-read":d.preventDefault();Miniflux.Item.MarkAsRead(a);break;case "mark-unread":d.preventDefault();Miniflux.Item.MarkAsUnread(a);break;case "mark-removed":d.preventDefault();Miniflux.Item.MarkAsRemoved(a);break;case "bookmark":d.preventDefault();Miniflux.Item.SwitchBookmark(a);break;case "download-item":d.preventDefault();Miniflux.Item.DownloadContent(a);break;case "original-link":d.preventDefault();Miniflux.Item.OpenOriginal(a);break;case "mark-all-read":d.preventDefault();Miniflux.Item.MarkListingAsRead("?action=unread");
break;case "mark-feed-read":d.preventDefault(),Miniflux.Item.MarkListingAsRead("?action=feed-items&feed_id="+d.target.getAttribute("data-feed-id"))}}}},ListenKeyboardEvents:function(){document.onkeypress=function(d){if(63==d.keyCode||!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)){var b=d.target||d.srcElement;if("INPUT"!=b.tagName&&"TEXTAREA"!=b.tagName)if(Miniflux.Event.lastEventType="keyboard",e.push(d.keyCode||d.which),103===e[0])switch(e[1]){case void 0:break;case 117:window.location.href="?action=unread";
e=[];break;case 98:window.location.href="?action=bookmarks";e=[];break;case 104:window.location.href="?action=history";e=[];break;case 115:window.location.href="?action=feeds";e=[];break;case 112:window.location.href="?action=config";e=[];break;default:e=[]}else switch(e=[],b=document.getElementById("current-item"),d.keyCode||d.which){case 100:Miniflux.Item.DownloadContent(b);break;case 112:case 107:Miniflux.Nav.SelectPreviousItem();break;case 110:case 106:Miniflux.Nav.SelectNextItem();break;case 118:Miniflux.Item.OpenOriginal(b);
break;case 111:Miniflux.Item.Show(b);break;case 109:Miniflux.Item.SwitchStatus(b);break;case 102:Miniflux.Item.SwitchBookmark(b);break;case 104:Miniflux.Nav.OpenPreviousPage();break;case 108:Miniflux.Nav.OpenNextPage();break;case 114:Miniflux.Feed.UpdateAll();break;case 63:Miniflux.Nav.ShowHelp();break;case 122:Miniflux.Item.ToggleRTLMode()}}}}}}();
Miniflux.Nav=function(){function e(b){var a=pageYOffset+document.documentElement.clientHeight;(0>a-(b.offsetTop+b.offsetHeight)||a-b.offsetTop>document.documentElement.clientHeight)&&window.scrollTo(0,b.offsetTop-10)}function d(){return document.getElementById("listing")?!0:!1}return{OpenNextPage:function(){var b=document.getElementById("next-page");b&&b.click()},OpenPreviousPage:function(){var b=document.getElementById("previous-page");b&&b.click()},SelectNextItem:function(){var b=document.getElementById("next-item");
if(b)b.click();else if(d())if(b=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var a=0,f=b.length;a<f;a++){if("current-item"===b[a].id){a+1<f&&(b[a].id="item-"+b[a].getAttribute("data-item-id"),b[a+1].id="current-item",e(b[a+1]));break}}else b[0].id="current-item",e(b[0])},SelectPreviousItem:function(){var b=document.getElementById("previous-item");if(b)b.click();else if(d())if(b=document.getElementsByTagName("article"),document.getElementById("current-item"))for(var a=
b.length-1;0<=a;a--){if("current-item"===b[a].id){0<=a-1&&(b[a].id="item-"+b[a].getAttribute("data-item-id"),b[a-1].id="current-item",e(b[a-1]));break}}else b[b.length-1].id="current-item",e(b[b.length-1])},ShowHelp:function(){open("?action=show-help","Help","width=320,height=450,location=no,scrollbars=no,status=no,toolbar=no")},IsListing:d}}();Miniflux.App.Run();

View File

@ -164,6 +164,9 @@ Miniflux.Event = (function() {
case 63: // ?
Miniflux.Nav.ShowHelp();
break;
case 122: // z
Miniflux.Item.ToggleRTLMode();
break;
}
}
}

View File

@ -249,6 +249,22 @@ Miniflux.Item = (function() {
request.open("POST", "?action=mark-items-as-read", true);
request.send(JSON.stringify(listing));
},
ToggleRTLMode: function() {
var tags = [
"#current-item h1",
"#item-content",
"#current-item h2",
"#current-item .preview"
];
for (var i = 0; i < tags.length; i++) {
var tag = document.querySelector(tags[i]);
if (tag) {
tag.dir = tag.dir == "" ? "rtl" : "";
}
}
}
};

View File

@ -216,4 +216,5 @@ return array(
// 'Value required' => '',
// 'Must be an integer' => '',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -216,4 +216,5 @@ return array(
'Value required' => 'Wert ist erforderlich',
'Must be an integer' => 'Muss eine Ganzzahl sein',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -216,4 +216,5 @@ return array(
// 'Value required' => '',
// 'Must be an integer' => '',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -216,4 +216,5 @@ return array(
'Value required' => 'Value required',
'Must be an integer' => 'Must be an integer',
'Remove automatically unread items' => 'Supprimer automatiquement les éléments non lus',
'Toggle RTL mode' => 'Basculer entre le mode RTL',
);

View File

@ -216,4 +216,5 @@ return array(
// 'Value required' => '',
// 'Must be an integer' => '',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -216,4 +216,5 @@ return array(
// 'Value required' => '',
// 'Must be an integer' => '',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -216,4 +216,5 @@ return array(
// 'Value required' => '',
// 'Must be an integer' => '',
// 'Remove automatically unread items' => '',
// 'Toggle RTL mode' => '',
);

View File

@ -3,6 +3,9 @@
in=assets/js/all.js
out=assets/js/all.min.js
rm -f $in 2>/dev/null
rm -f $out 2>/dev/null
cat assets/js/app.js assets/js/feed.js assets/js/item.js assets/js/event.js assets/js/nav.js > $in
echo "Miniflux.App.Run();" >> $in

View File

@ -16,6 +16,7 @@
<li><?= t('Bookmark item') ?> = <strong>f</strong></li>
<li><?= t('Previous page') ?> = <strong>h</strong></li>
<li><?= t('Next page') ?> = <strong>l</strong></li>
<li><?= t('Toggle RTL mode') ?> = <strong>z</strong></li>
<li><?= t('Show help') ?> = <strong>?</strong></li>
<li><?= t('Close help') ?> = <strong>q</strong></li>
</ul>