]> git.wh0rd.org - tt-rss.git/blobdiff - js/functions.js
remove some unnecessary element IDs
[tt-rss.git] / js / functions.js
index 100da5f8591ae38b99ca347a7f305c73a86f0b7b..437ea1d0dd9161292aba2e45059830e921eac694 100755 (executable)
@@ -5,6 +5,9 @@ let _label_base_index = -1024;
 let loading_progress = 0;
 let notify_hide_timerid = false;
 
+let hotkey_prefix = 0;
+let hotkey_prefix_pressed = false;
+
 Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
        function (callOriginal, options) {
 
@@ -27,14 +30,14 @@ Ajax.Base.prototype.initialize = Ajax.Base.prototype.initialize.wrap(
 
 function xhrPost(url, params, complete) {
        console.log("xhrPost:", params);
-    new Ajax.Request(url, {
+    return new Ajax.Request(url, {
         parameters: params,
         onComplete: complete
     });
 }
 
 function xhrJson(url, params, complete) {
-    xhrPost(url, params, (reply) => {
+    return xhrPost(url, params, (reply) => {
         try {
             const obj = JSON.parse(reply.responseText);
             complete(obj);
@@ -498,9 +501,6 @@ function hotkey_prefix_timeout() {
                hotkey_prefix = false;
                Element.hide('cmdline');
        }
-
-       setTimeout(hotkey_prefix_timeout, 1000);
-
 }
 
 function uploadIconHandler(rc) {
@@ -1087,8 +1087,25 @@ function backend_sanity_check_callback(transport) {
                console.log('reading init-params...');
 
                for (const k in params) {
-                       console.log("IP:", k, "=>", params[k]);
-                       if (k == "label_base_index") _label_base_index = parseInt(params[k]);
+                       switch (k) {
+                               case "label_base_index":
+                    _label_base_index = parseInt(params[k])
+                                       break;
+                               case "hotkeys":
+                                       // filter mnemonic definitions (used for help panel) from hotkeys map
+                                       // i.e. *(191)|Ctrl-/ -> *(191)
+
+                    const tmp = [];
+                    for (const sequence in params[k][1]) {
+                        const filtered = sequence.replace(/\|.*$/, "");
+                        tmp[filtered] = params[k][1][sequence];
+                    }
+
+                    params[k][1] = tmp;
+                    break;
+                       }
+
+            console.log("IP:", k, "=>", params[k]);
                }
 
                init_params = params;
@@ -1101,9 +1118,7 @@ function backend_sanity_check_callback(transport) {
 }
 
 function genUrlChangeKey(feed, is_cat) {
-       const ok = confirm(__("Generate new syndication address for this feed?"));
-
-       if (ok) {
+       if (confirm(__("Generate new syndication address for this feed?"))) {
 
                notify_progress("Trying to change address...", true);
 
@@ -1375,12 +1390,8 @@ function showFeedsWithErrors() {
                removeSelected: function() {
                        const sel_rows = this.getSelectedFeeds();
 
-                       console.log(sel_rows);
-
                        if (sel_rows.length > 0) {
-                               const ok = confirm(__("Remove selected feeds?"));
-
-                               if (ok) {
+                               if (confirm(__("Remove selected feeds?"))) {
                                        notify_progress("Removing selected feeds...", true);
 
                                        const query = { op: "pref-feeds", method: "remove",
@@ -1413,85 +1424,21 @@ function get_timestamp() {
 }
 
 function helpDialog(topic) {
-       const query = "backend.php?op=backend&method=help&topic=" + param_escape(topic);
+    const query = "backend.php?op=backend&method=help&topic=" + param_escape(topic);
 
-       if (dijit.byId("helpDlg"))
-               dijit.byId("helpDlg").destroyRecursive();
+    if (dijit.byId("helpDlg"))
+        dijit.byId("helpDlg").destroyRecursive();
 
-       const dialog = new dijit.Dialog({
-               id: "helpDlg",
-               title: __("Help"),
-               style: "width: 600px",
-               href: query,
-       });
-
-       dialog.show();
-}
+    const dialog = new dijit.Dialog({
+        id: "helpDlg",
+        title: __("Help"),
+        style: "width: 600px",
+        href: query,
+    });
 
-function htmlspecialchars_decode (string, quote_style) {
-  // http://kevin.vanzonneveld.net
-  // +   original by: Mirek Slugen
-  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  // +   bugfixed by: Mateusz "loonquawl" Zalega
-  // +      input by: ReverseSyntax
-  // +      input by: Slawomir Kaniecki
-  // +      input by: Scott Cariss
-  // +      input by: Francois
-  // +   bugfixed by: Onno Marsman
-  // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
-  // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
-  // +      input by: Ratheous
-  // +      input by: Mailfaker (http://www.weedem.fr/)
-  // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
-  // +    bugfixed by: Brett Zamir (http://brett-zamir.me)
-  // *     example 1: htmlspecialchars_decode("<p>this -&gt; &quot;</p>", 'ENT_NOQUOTES');
-  // *     returns 1: '<p>this -> &quot;</p>'
-  // *     example 2: htmlspecialchars_decode("&amp;quot;");
-  // *     returns 2: '&quot;'
-  let optTemp = 0,
-    i = 0,
-    noquotes = false;
-  if (typeof quote_style === 'undefined') {
-    quote_style = 2;
-  }
-  string = string.toString().replace(/&lt;/g, '<').replace(/&gt;/g, '>');
-  const OPTS = {
-    'ENT_NOQUOTES': 0,
-    'ENT_HTML_QUOTE_SINGLE': 1,
-    'ENT_HTML_QUOTE_DOUBLE': 2,
-    'ENT_COMPAT': 2,
-    'ENT_QUOTES': 3,
-    'ENT_IGNORE': 4
-  };
-  if (quote_style === 0) {
-    noquotes = true;
-  }
-  if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
-    quote_style = [].concat(quote_style);
-    for (i = 0; i < quote_style.length; i++) {
-      // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
-      if (OPTS[quote_style[i]] === 0) {
-        noquotes = true;
-      } else if (OPTS[quote_style[i]]) {
-        optTemp = optTemp | OPTS[quote_style[i]];
-      }
-    }
-    quote_style = optTemp;
-  }
-  if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
-    string = string.replace(/&#0*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should
-    // string = string.replace(/&apos;|&#x0*27;/g, "'"); // This would also be useful here, but not a part of PHP
-  }
-  if (!noquotes) {
-    string = string.replace(/&quot;/g, '"');
-  }
-  // Put this in last place to avoid escape being double-decoded
-  string = string.replace(/&amp;/g, '&');
-
-  return string;
+    dialog.show();
 }
 
-
 function label_to_feed_id(label) {
        return _label_base_index - 1 - Math.abs(label);
 }
@@ -1537,3 +1484,58 @@ function openArticlePopup(id) {
        w.opener = null;
        w.location = "backend.php?op=article&method=view&mode=raw&html=1&zoom=1&id=" + id + "&csrf_token=" + getInitParam("csrf_token");
 }
+
+function keyevent_to_action(e) {
+
+    const hotkeys_map = getInitParam("hotkeys");
+    const keycode = e.which;
+    const keychar = String.fromCharCode(keycode).toLowerCase();
+
+    if (keycode == 27) { // escape and drop prefix
+        hotkey_prefix = false;
+    }
+
+    if (keycode == 16 || keycode == 17) return; // ignore lone shift / ctrl
+
+    if (!hotkey_prefix && hotkeys_map[0].indexOf(keychar) != -1) {
+
+        const date = new Date();
+        const ts = Math.round(date.getTime() / 1000);
+
+        hotkey_prefix = keychar;
+        hotkey_prefix_pressed = ts;
+
+        $("cmdline").innerHTML = keychar;
+        Element.show("cmdline");
+
+        e.stopPropagation();
+
+        return false;
+    }
+
+    Element.hide("cmdline");
+
+    let hotkey_name = keychar.search(/[a-zA-Z0-9]/) != -1 ? keychar : "(" + keycode + ")";
+
+    // ensure ^*char notation
+    if (e.shiftKey) hotkey_name = "*" + hotkey_name;
+    if (e.ctrlKey) hotkey_name = "^" + hotkey_name;
+    if (e.altKey) hotkey_name = "+" + hotkey_name;
+    if (e.metaKey) hotkey_name = "%" + hotkey_name;
+
+    const hotkey_full = hotkey_prefix ? hotkey_prefix + " " + hotkey_name : hotkey_name;
+    hotkey_prefix = false;
+
+    let action_name = false;
+
+    for (const sequence in hotkeys_map[1]) {
+        if (sequence == hotkey_full) {
+            action_name = hotkeys_map[1][sequence];
+            break;
+        }
+    }
+
+    console.log('keyevent_to_action', hotkey_full, '=>', action_name);
+
+    return action_name;
+}
\ No newline at end of file