Browse Source

기본적인 단축키 추가

Surplus_Up (2DU) 7 năm trước cách đây
mục cha
commit
2b57ff54ff
5 tập tin đã thay đổi với 243 bổ sung4 xóa
  1. 1 1
      LICENSE
  2. 4 3
      readme-ko.md
  3. 1 0
      readme.md
  4. 223 0
      views/main_css/js/shotcuts.js
  5. 14 0
      views/main_css/js/shotcuts_set.js

+ 1 - 1
LICENSE

@@ -1,6 +1,6 @@
 BSD 3-Clause License
 
-Copyright (c) 2017-2018, 2DU
+Copyright (c) 2017-2019, 2DU
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without

+ 4 - 3
readme-ko.md

@@ -43,9 +43,10 @@ openNAMU는 완전한 오픈소스 프로젝트입니다. 새로운 기능을 
 openNAMU 프로젝트는 [BSD 3-Clause License](./LICENSE)(이하 이용허락)의 보호를 받고 있으며, openNAMU 프로젝트를 사용하고자 한다면 를 준수해야 합니다. 본 이용허락를 위반할 경우 개발자는 DMCA Takedown 등 관련 제재를 관계자에게 요청할 권리가 있으며, 그 책임은 모두 이용허락 위반 사용자에게 있습니다. 자세한 내용은 문서를 참고하세요.
 
 ### 포함된 외부 프로젝트
- * Quotes icon - [Dave Gandy](http://www.flaticon.com/free-icon/quote-left_25672) - CC 3.0 BY
- * Syntax highlighting - [highlightjs](https://highlightjs.org/) - [BSD License](https://github.com/highlightjs/highlight.js/blob/master/LICENSE)
- * Numerical expression - [MathJax](https://www.mathjax.org/) - [Apache License 2.0](https://github.com/mathjax/MathJax/blob/master/LICENSE)
+ * Quotes icon - [Dave Gandy](http://www.flaticon.com/free-icon/quote-left_25672)
+ * Syntax highlighting - [highlightjs](https://highlightjs.org/) 
+ * Numerical expression - [MathJax](https://www.mathjax.org/)
+ * Handling Keyboard Shortcuts [shortcut.js](http://www.openjs.com/scripts/events/keyboard_shortcuts/)
 
 ## 기여자 목록
  * [참고](https://github.com/2DU/openNAMU/graphs/contributors)

+ 1 - 0
readme.md

@@ -72,6 +72,7 @@ openNAMU is protected by [BSD 3-Clause License](./LICNESE). Please refer to the
  * Quotes icon [Dave Gandy](http://www.flaticon.com/free-icon/quote-left_25672) CC 3.0 BY
  * Syntax highlighting [highlightjs](https://highlightjs.org/)
  * Numerical expression [MathJax](https://www.mathjax.org/)
+ * Handling Keyboard Shortcuts [shortcut.js](http://www.openjs.com/scripts/events/keyboard_shortcuts/)
 
 # Authors
  * [Reference](https://github.com/2DU/openNAMU/graphs/contributors)

+ 223 - 0
views/main_css/js/shotcuts.js

@@ -0,0 +1,223 @@
+/**
+ * http://www.openjs.com/scripts/events/keyboard_shortcuts/
+ * Version : 2.01.B
+ * By Binny V A
+ * License : BSD
+ */
+shortcut = {
+    'all_shortcuts': {},//All the shortcuts are stored in this array
+    'add': function (shortcut_combination, callback, opt) {
+        //Provide a set of default options
+        var default_options = {
+            'type': 'keydown',
+            'propagate': false,
+            'disable_in_input': false,
+            'target': document,
+            'keycode': false
+        }
+        if (!opt) opt = default_options;
+        else {
+            for (var dfo in default_options) {
+                if (typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
+            }
+        }
+
+        var ele = opt.target;
+        if (typeof opt.target == 'string') ele = document.getElementById(opt.target);
+        var ths = this;
+        shortcut_combination = shortcut_combination.toLowerCase();
+
+        //The function to be called at keypress
+        var func = function (e) {
+            e = e || window.event;
+
+            if (opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
+                var element;
+                if (e.target) element = e.target;
+                else if (e.srcElement) element = e.srcElement;
+                if (element.nodeType == 3) element = element.parentNode;
+
+                if (element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
+            }
+
+            //Find Which key is pressed
+            if (e.keyCode) code = e.keyCode;
+            else if (e.which) code = e.which;
+            var character = String.fromCharCode(code).toLowerCase();
+
+            if (code == 188) character = ","; //If the user presses , when the type is onkeydown
+            if (code == 190) character = "."; //If the user presses , when the type is onkeydown
+
+            var keys = shortcut_combination.split("+");
+            //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
+            var kp = 0;
+
+            //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
+            var shift_nums = {
+                "`": "~",
+                "1": "!",
+                "2": "@",
+                "3": "#",
+                "4": "$",
+                "5": "%",
+                "6": "^",
+                "7": "&",
+                "8": "*",
+                "9": "(",
+                "0": ")",
+                "-": "_",
+                "=": "+",
+                ";": ":",
+                "'": "\"",
+                ",": "<",
+                ".": ">",
+                "/": "?",
+                "\\": "|"
+            }
+            //Special Keys - and their codes
+            var special_keys = {
+                'esc': 27,
+                'escape': 27,
+                'tab': 9,
+                'space': 32,
+                'return': 13,
+                'enter': 13,
+                'backspace': 8,
+
+                'scrolllock': 145,
+                'scroll_lock': 145,
+                'scroll': 145,
+                'capslock': 20,
+                'caps_lock': 20,
+                'caps': 20,
+                'numlock': 144,
+                'num_lock': 144,
+                'num': 144,
+
+                'pause': 19,
+                'break': 19,
+
+                'insert': 45,
+                'home': 36,
+                'delete': 46,
+                'end': 35,
+
+                'pageup': 33,
+                'page_up': 33,
+                'pu': 33,
+
+                'pagedown': 34,
+                'page_down': 34,
+                'pd': 34,
+
+                'left': 37,
+                'up': 38,
+                'right': 39,
+                'down': 40,
+
+                'f1': 112,
+                'f2': 113,
+                'f3': 114,
+                'f4': 115,
+                'f5': 116,
+                'f6': 117,
+                'f7': 118,
+                'f8': 119,
+                'f9': 120,
+                'f10': 121,
+                'f11': 122,
+                'f12': 123
+            }
+
+            var modifiers = {
+                shift: { wanted: false, pressed: false },
+                ctrl: { wanted: false, pressed: false },
+                alt: { wanted: false, pressed: false },
+                meta: { wanted: false, pressed: false }	//Meta is Mac specific
+            };
+
+            if (e.ctrlKey) modifiers.ctrl.pressed = true;
+            if (e.shiftKey) modifiers.shift.pressed = true;
+            if (e.altKey) modifiers.alt.pressed = true;
+            if (e.metaKey) modifiers.meta.pressed = true;
+
+            for (var i = 0; k = keys[i], i < keys.length; i++) {
+                //Modifiers
+                if (k == 'ctrl' || k == 'control') {
+                    kp++;
+                    modifiers.ctrl.wanted = true;
+
+                } else if (k == 'shift') {
+                    kp++;
+                    modifiers.shift.wanted = true;
+
+                } else if (k == 'alt') {
+                    kp++;
+                    modifiers.alt.wanted = true;
+                } else if (k == 'meta') {
+                    kp++;
+                    modifiers.meta.wanted = true;
+                } else if (k.length > 1) { //If it is a special key
+                    if (special_keys[k] == code) kp++;
+
+                } else if (opt['keycode']) {
+                    if (opt['keycode'] == code) kp++;
+
+                } else { //The special keys did not match
+                    if (character == k) kp++;
+                    else {
+                        if (shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
+                            character = shift_nums[character];
+                            if (character == k) kp++;
+                        }
+                    }
+                }
+            }
+
+            if (kp == keys.length &&
+						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
+						modifiers.shift.pressed == modifiers.shift.wanted &&
+						modifiers.alt.pressed == modifiers.alt.wanted &&
+						modifiers.meta.pressed == modifiers.meta.wanted) {
+                callback(e);
+
+                if (!opt['propagate']) { //Stop the event
+                    //e.cancelBubble is supported by IE - this will kill the bubbling process.
+                    e.cancelBubble = true;
+                    e.returnValue = false;
+
+                    //e.stopPropagation works in Firefox.
+                    if (e.stopPropagation) {
+                        e.stopPropagation();
+                        e.preventDefault();
+                    }
+                    return false;
+                }
+            }
+        }
+        this.all_shortcuts[shortcut_combination] = {
+            'callback': func,
+            'target': ele,
+            'event': opt['type']
+        };
+        //Attach the function with the event
+        if (ele.addEventListener) ele.addEventListener(opt['type'], func, false);
+        else if (ele.attachEvent) ele.attachEvent('on' + opt['type'], func);
+        else ele['on' + opt['type']] = func;
+    },
+
+    //Remove the shortcut - just specify the shortcut and I will remove the binding
+    'remove': function (shortcut_combination) {
+        shortcut_combination = shortcut_combination.toLowerCase();
+        var binding = this.all_shortcuts[shortcut_combination];
+        delete (this.all_shortcuts[shortcut_combination])
+        if (!binding) return;
+        var type = binding['event'];
+        var ele = binding['target'];
+        var callback = binding['callback'];
+
+        if (ele.detachEvent) ele.detachEvent('on' + type, callback);
+        else if (ele.removeEventListener) ele.removeEventListener(type, callback, false);
+        else ele['on' + type] = false;
+    }
+}

+ 14 - 0
views/main_css/js/shotcuts_set.js

@@ -0,0 +1,14 @@
+all_list = [
+    ['F', '/'],
+    ['C', '/recent_changes'],
+    ['D', '/recent_discuss'],
+    ['A', '/random']
+];
+
+all_list.forEach(function(element) {
+    shortcut.add(element[0], function() {
+        window.location.href = element[1];
+    }, {
+        'disable_in_input' : true
+    }); 
+});