diff --git a/src/resources/pre_template.html b/src/resources/pre_template.html
index b7c37693..426e9f79 100644
--- a/src/resources/pre_template.html
+++ b/src/resources/pre_template.html
@@ -16,6 +16,7 @@
'use strict';
var placeholder = document.getElementById('placeholder');
var content;
+ var keyState = 0;
var scrollToAnchor = function(anchor) {
document.getElementById(anchor).scrollIntoView();
@@ -63,4 +64,81 @@
content.setHeader(curHeader);
}
}
+
+ document.onkeydown = function(e) {
+ e = e || window.event;
+ var key;
+ var shift;
+ var ctrl;
+ if (e.which) {
+ key = e.which;
+ } else {
+ key = e.keyCode;
+ }
+ shift = !!e.shiftKey;
+ ctrl = !!e.ctrlKey;
+ switch (key) {
+ case 74: // J
+ window.scrollBy(0, 100);
+ keyState = 0;
+ break;
+
+ case 75: // K
+ window.scrollBy(0, -100);
+ keyState = 0;
+ break;
+
+ case 72: // H
+ window.scrollBy(-100, 0);
+ keyState = 0;
+ break;
+
+ case 76: // L
+ window.scrollBy(100, 0);
+ keyState = 0;
+ break;
+
+ case 71: // G
+ if (shift) {
+ var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset;
+ var scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
+ window.scrollTo(scrollLeft, scrollHeight);
+ keyState = 0;
+ break;
+ } else {
+ if (keyState == 0) {
+ keyState = 1;
+ } else if (keyState == 1) {
+ keyState = 0;
+ var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset;
+ window.scrollTo(scrollLeft, 0);
+ }
+ break;
+ }
+ return;
+
+ case 85: // U
+ keyState = 0;
+ if (ctrl) {
+ var clientHeight = document.documentElement.clientHeight;
+ window.scrollBy(0, -clientHeight);
+ break;
+ }
+ return;
+
+ case 68: // D
+ keyState = 0;
+ if (ctrl) {
+ var clientHeight = document.documentElement.clientHeight;
+ window.scrollBy(0, clientHeight);
+ break;
+ }
+ return;
+
+ default:
+ keyState = 0;
+ return;
+ }
+ e.preventDefault();
+ }
diff --git a/src/resources/template.html b/src/resources/template.html
index 52030c65..b2596318 100644
--- a/src/resources/template.html
+++ b/src/resources/template.html
@@ -21,6 +21,7 @@
var toc = []; // Table of contents as a list
var content; // Channel variable with content
var nameCounter = 0;
+ var keyState = 0;
renderer.heading = function (text, level) {
// Use number to avoid issues with Chinese
@@ -180,6 +181,83 @@
content.setHeader(curHeader);
}
}
+
+ document.onkeydown = function(e) {
+ e = e || window.event;
+ var key;
+ var shift;
+ var ctrl;
+ if (e.which) {
+ key = e.which;
+ } else {
+ key = e.keyCode;
+ }
+ shift = !!e.shiftKey;
+ ctrl = !!e.ctrlKey;
+ switch (key) {
+ case 74: // J
+ window.scrollBy(0, 100);
+ keyState = 0;
+ break;
+
+ case 75: // K
+ window.scrollBy(0, -100);
+ keyState = 0;
+ break;
+
+ case 72: // H
+ window.scrollBy(-100, 0);
+ keyState = 0;
+ break;
+
+ case 76: // L
+ window.scrollBy(100, 0);
+ keyState = 0;
+ break;
+
+ case 71: // G
+ if (shift) {
+ var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset;
+ var scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
+ window.scrollTo(scrollLeft, scrollHeight);
+ keyState = 0;
+ break;
+ } else {
+ if (keyState == 0) {
+ keyState = 1;
+ } else if (keyState == 1) {
+ keyState = 0;
+ var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset;
+ window.scrollTo(scrollLeft, 0);
+ }
+ break;
+ }
+ return;
+
+ case 85: // U
+ keyState = 0;
+ if (ctrl) {
+ var clientHeight = document.documentElement.clientHeight;
+ window.scrollBy(0, -clientHeight);
+ break;
+ }
+ return;
+
+ case 68: // D
+ keyState = 0;
+ if (ctrl) {
+ var clientHeight = document.documentElement.clientHeight;
+ window.scrollBy(0, clientHeight);
+ break;
+ }
+ return;
+
+ default:
+ keyState = 0;
+ return;
+ }
+ e.preventDefault();
+ }