[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/dist/ -> keycodes.js (source)

   1  this["wp"] = this["wp"] || {}; this["wp"]["keycodes"] =
   2  /******/ (function(modules) { // webpackBootstrap
   3  /******/     // The module cache
   4  /******/     var installedModules = {};
   5  /******/
   6  /******/     // The require function
   7  /******/ 	function __webpack_require__(moduleId) {
   8  /******/
   9  /******/         // Check if module is in cache
  10  /******/         if(installedModules[moduleId]) {
  11  /******/             return installedModules[moduleId].exports;
  12  /******/         }
  13  /******/         // Create a new module (and put it into the cache)
  14  /******/         var module = installedModules[moduleId] = {
  15  /******/             i: moduleId,
  16  /******/             l: false,
  17  /******/             exports: {}
  18  /******/         };
  19  /******/
  20  /******/         // Execute the module function
  21  /******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  22  /******/
  23  /******/         // Flag the module as loaded
  24  /******/         module.l = true;
  25  /******/
  26  /******/         // Return the exports of the module
  27  /******/         return module.exports;
  28  /******/     }
  29  /******/
  30  /******/
  31  /******/     // expose the modules object (__webpack_modules__)
  32  /******/     __webpack_require__.m = modules;
  33  /******/
  34  /******/     // expose the module cache
  35  /******/     __webpack_require__.c = installedModules;
  36  /******/
  37  /******/     // define getter function for harmony exports
  38  /******/     __webpack_require__.d = function(exports, name, getter) {
  39  /******/         if(!__webpack_require__.o(exports, name)) {
  40  /******/             Object.defineProperty(exports, name, { enumerable: true, get: getter });
  41  /******/         }
  42  /******/     };
  43  /******/
  44  /******/     // define __esModule on exports
  45  /******/     __webpack_require__.r = function(exports) {
  46  /******/         if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  47  /******/             Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  48  /******/         }
  49  /******/         Object.defineProperty(exports, '__esModule', { value: true });
  50  /******/     };
  51  /******/
  52  /******/     // create a fake namespace object
  53  /******/     // mode & 1: value is a module id, require it
  54  /******/     // mode & 2: merge all properties of value into the ns
  55  /******/     // mode & 4: return value when already ns object
  56  /******/     // mode & 8|1: behave like require
  57  /******/     __webpack_require__.t = function(value, mode) {
  58  /******/         if(mode & 1) value = __webpack_require__(value);
  59  /******/         if(mode & 8) return value;
  60  /******/         if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  61  /******/         var ns = Object.create(null);
  62  /******/         __webpack_require__.r(ns);
  63  /******/         Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  64  /******/         if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  65  /******/         return ns;
  66  /******/     };
  67  /******/
  68  /******/     // getDefaultExport function for compatibility with non-harmony modules
  69  /******/     __webpack_require__.n = function(module) {
  70  /******/         var getter = module && module.__esModule ?
  71  /******/ 			function getDefault() { return module['default']; } :
  72  /******/ 			function getModuleExports() { return module; };
  73  /******/         __webpack_require__.d(getter, 'a', getter);
  74  /******/         return getter;
  75  /******/     };
  76  /******/
  77  /******/     // Object.prototype.hasOwnProperty.call
  78  /******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  79  /******/
  80  /******/     // __webpack_public_path__
  81  /******/     __webpack_require__.p = "";
  82  /******/
  83  /******/
  84  /******/     // Load entry module and return exports
  85  /******/     return __webpack_require__(__webpack_require__.s = 449);
  86  /******/ })
  87  /************************************************************************/
  88  /******/ ({
  89  
  90  /***/ 1:
  91  /***/ (function(module, exports) {
  92  
  93  (function() { module.exports = this["wp"]["i18n"]; }());
  94  
  95  /***/ }),
  96  
  97  /***/ 18:
  98  /***/ (function(module, __webpack_exports__, __webpack_require__) {
  99  
 100  "use strict";
 101  
 102  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
 103  var arrayLikeToArray = __webpack_require__(25);
 104  
 105  // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
 106  
 107  function _arrayWithoutHoles(arr) {
 108    if (Array.isArray(arr)) return Object(arrayLikeToArray["a" /* default */])(arr);
 109  }
 110  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
 111  var iterableToArray = __webpack_require__(35);
 112  
 113  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
 114  var unsupportedIterableToArray = __webpack_require__(27);
 115  
 116  // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
 117  function _nonIterableSpread() {
 118    throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
 119  }
 120  // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
 121  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _toConsumableArray; });
 122  
 123  
 124  
 125  
 126  function _toConsumableArray(arr) {
 127    return _arrayWithoutHoles(arr) || Object(iterableToArray["a" /* default */])(arr) || Object(unsupportedIterableToArray["a" /* default */])(arr) || _nonIterableSpread();
 128  }
 129  
 130  /***/ }),
 131  
 132  /***/ 2:
 133  /***/ (function(module, exports) {
 134  
 135  (function() { module.exports = this["lodash"]; }());
 136  
 137  /***/ }),
 138  
 139  /***/ 25:
 140  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 141  
 142  "use strict";
 143  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _arrayLikeToArray; });
 144  function _arrayLikeToArray(arr, len) {
 145    if (len == null || len > arr.length) len = arr.length;
 146  
 147    for (var i = 0, arr2 = new Array(len); i < len; i++) {
 148      arr2[i] = arr[i];
 149    }
 150  
 151    return arr2;
 152  }
 153  
 154  /***/ }),
 155  
 156  /***/ 27:
 157  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 158  
 159  "use strict";
 160  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _unsupportedIterableToArray; });
 161  /* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25);
 162  
 163  function _unsupportedIterableToArray(o, minLen) {
 164    if (!o) return;
 165    if (typeof o === "string") return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(o, minLen);
 166    var n = Object.prototype.toString.call(o).slice(8, -1);
 167    if (n === "Object" && o.constructor) n = o.constructor.name;
 168    if (n === "Map" || n === "Set") return Array.from(n);
 169    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(o, minLen);
 170  }
 171  
 172  /***/ }),
 173  
 174  /***/ 35:
 175  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 176  
 177  "use strict";
 178  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _iterableToArray; });
 179  function _iterableToArray(iter) {
 180    if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
 181  }
 182  
 183  /***/ }),
 184  
 185  /***/ 449:
 186  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 187  
 188  "use strict";
 189  __webpack_require__.r(__webpack_exports__);
 190  
 191  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
 192  var defineProperty = __webpack_require__(5);
 193  
 194  // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules
 195  var toConsumableArray = __webpack_require__(18);
 196  
 197  // EXTERNAL MODULE: external {"this":"lodash"}
 198  var external_this_lodash_ = __webpack_require__(2);
 199  
 200  // EXTERNAL MODULE: external {"this":["wp","i18n"]}
 201  var external_this_wp_i18n_ = __webpack_require__(1);
 202  
 203  // CONCATENATED MODULE: ./node_modules/@wordpress/keycodes/build-module/platform.js
 204  /**
 205   * External dependencies
 206   */
 207  
 208  /**
 209   * Return true if platform is MacOS.
 210   *
 211   * @param {Object} _window   window object by default; used for DI testing.
 212   *
 213   * @return {boolean}         True if MacOS; false otherwise.
 214   */
 215  
 216  function isAppleOS() {
 217    var _window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
 218  
 219    var platform = _window.navigator.platform;
 220    return platform.indexOf('Mac') !== -1 || Object(external_this_lodash_["includes"])(['iPad', 'iPhone'], platform);
 221  }
 222  
 223  // CONCATENATED MODULE: ./node_modules/@wordpress/keycodes/build-module/index.js
 224  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BACKSPACE", function() { return BACKSPACE; });
 225  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TAB", function() { return TAB; });
 226  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENTER", function() { return ENTER; });
 227  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ESCAPE", function() { return ESCAPE; });
 228  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SPACE", function() { return SPACE; });
 229  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LEFT", function() { return LEFT; });
 230  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UP", function() { return UP; });
 231  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RIGHT", function() { return RIGHT; });
 232  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DOWN", function() { return DOWN; });
 233  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DELETE", function() { return DELETE; });
 234  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "F10", function() { return F10; });
 235  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ALT", function() { return ALT; });
 236  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CTRL", function() { return CTRL; });
 237  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMMAND", function() { return COMMAND; });
 238  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SHIFT", function() { return SHIFT; });
 239  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modifiers", function() { return modifiers; });
 240  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rawShortcut", function() { return rawShortcut; });
 241  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "displayShortcutList", function() { return displayShortcutList; });
 242  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "displayShortcut", function() { return displayShortcut; });
 243  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shortcutAriaLabel", function() { return shortcutAriaLabel; });
 244  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isKeyboardEvent", function() { return isKeyboardEvent; });
 245  
 246  
 247  
 248  /**
 249   * Note: The order of the modifier keys in many of the [foo]Shortcut()
 250   * functions in this file are intentional and should not be changed. They're
 251   * designed to fit with the standard menu keyboard shortcuts shown in the
 252   * user's platform.
 253   *
 254   * For example, on MacOS menu shortcuts will place Shift before Command, but
 255   * on Windows Control will usually come first. So don't provide your own
 256   * shortcut combos directly to keyboardShortcut().
 257   */
 258  
 259  /**
 260   * External dependencies
 261   */
 262  
 263  /**
 264   * WordPress dependencies
 265   */
 266  
 267  
 268  /**
 269   * Internal dependencies
 270   */
 271  
 272  
 273  /**
 274   * @typedef {'primary'|'primaryShift'|'primaryAlt'|'secondary'|'access'|'ctrl'|'alt'|'ctrlShift'|'shift'|'shiftAlt'} WPKeycodeModifier
 275   */
 276  
 277  /**
 278   * An object of handler functions for each of the possible modifier
 279   * combinations. A handler will return a value for a given key.
 280   *
 281   * @typedef {{[M in WPKeycodeModifier]:(key:string)=>any}} WPKeycodeHandlerByModifier
 282   */
 283  
 284  /**
 285   * Keycode for BACKSPACE key.
 286   */
 287  
 288  var BACKSPACE = 8;
 289  /**
 290   * Keycode for TAB key.
 291   */
 292  
 293  var TAB = 9;
 294  /**
 295   * Keycode for ENTER key.
 296   */
 297  
 298  var ENTER = 13;
 299  /**
 300   * Keycode for ESCAPE key.
 301   */
 302  
 303  var ESCAPE = 27;
 304  /**
 305   * Keycode for SPACE key.
 306   */
 307  
 308  var SPACE = 32;
 309  /**
 310   * Keycode for LEFT key.
 311   */
 312  
 313  var LEFT = 37;
 314  /**
 315   * Keycode for UP key.
 316   */
 317  
 318  var UP = 38;
 319  /**
 320   * Keycode for RIGHT key.
 321   */
 322  
 323  var RIGHT = 39;
 324  /**
 325   * Keycode for DOWN key.
 326   */
 327  
 328  var DOWN = 40;
 329  /**
 330   * Keycode for DELETE key.
 331   */
 332  
 333  var DELETE = 46;
 334  /**
 335   * Keycode for F10 key.
 336   */
 337  
 338  var F10 = 121;
 339  /**
 340   * Keycode for ALT key.
 341   */
 342  
 343  var ALT = 'alt';
 344  /**
 345   * Keycode for CTRL key.
 346   */
 347  
 348  var CTRL = 'ctrl';
 349  /**
 350   * Keycode for COMMAND/META key.
 351   */
 352  
 353  var COMMAND = 'meta';
 354  /**
 355   * Keycode for SHIFT key.
 356   */
 357  
 358  var SHIFT = 'shift';
 359  /**
 360   * Object that contains functions that return the available modifier
 361   * depending on platform.
 362   *
 363   * - `primary`: takes a isApple function as a parameter.
 364   * - `primaryShift`: takes a isApple function as a parameter.
 365   * - `primaryAlt`: takes a isApple function as a parameter.
 366   * - `secondary`: takes a isApple function as a parameter.
 367   * - `access`: takes a isApple function as a parameter.
 368   * - `ctrl`
 369   * - `alt`
 370   * - `ctrlShift`
 371   * - `shift`
 372   * - `shiftAlt`
 373   */
 374  
 375  var modifiers = {
 376    primary: function primary(_isApple) {
 377      return _isApple() ? [COMMAND] : [CTRL];
 378    },
 379    primaryShift: function primaryShift(_isApple) {
 380      return _isApple() ? [SHIFT, COMMAND] : [CTRL, SHIFT];
 381    },
 382    primaryAlt: function primaryAlt(_isApple) {
 383      return _isApple() ? [ALT, COMMAND] : [CTRL, ALT];
 384    },
 385    secondary: function secondary(_isApple) {
 386      return _isApple() ? [SHIFT, ALT, COMMAND] : [CTRL, SHIFT, ALT];
 387    },
 388    access: function access(_isApple) {
 389      return _isApple() ? [CTRL, ALT] : [SHIFT, ALT];
 390    },
 391    ctrl: function ctrl() {
 392      return [CTRL];
 393    },
 394    alt: function alt() {
 395      return [ALT];
 396    },
 397    ctrlShift: function ctrlShift() {
 398      return [CTRL, SHIFT];
 399    },
 400    shift: function shift() {
 401      return [SHIFT];
 402    },
 403    shiftAlt: function shiftAlt() {
 404      return [SHIFT, ALT];
 405    }
 406  };
 407  /**
 408   * An object that contains functions to get raw shortcuts.
 409   * E.g. rawShortcut.primary( 'm' ) will return 'meta+m' on Mac.
 410   * These are intended for user with the KeyboardShortcuts component or TinyMCE.
 411   *
 412   * @type {WPKeycodeHandlerByModifier} Keyed map of functions to raw shortcuts.
 413   */
 414  
 415  var rawShortcut = Object(external_this_lodash_["mapValues"])(modifiers, function (modifier) {
 416    return function (character) {
 417      var _isApple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : isAppleOS;
 418  
 419      return [].concat(Object(toConsumableArray["a" /* default */])(modifier(_isApple)), [character.toLowerCase()]).join('+');
 420    };
 421  });
 422  /**
 423   * Return an array of the parts of a keyboard shortcut chord for display
 424   * E.g displayShortcutList.primary( 'm' ) will return [ '⌘', 'M' ] on Mac.
 425   *
 426   * @type {WPKeycodeHandlerByModifier} Keyed map of functions to shortcut
 427   *                                    sequences.
 428   */
 429  
 430  var displayShortcutList = Object(external_this_lodash_["mapValues"])(modifiers, function (modifier) {
 431    return function (character) {
 432      var _replacementKeyMap;
 433  
 434      var _isApple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : isAppleOS;
 435  
 436      var isApple = _isApple();
 437  
 438      var replacementKeyMap = (_replacementKeyMap = {}, Object(defineProperty["a" /* default */])(_replacementKeyMap, ALT, isApple ? '⌥' : 'Alt'), Object(defineProperty["a" /* default */])(_replacementKeyMap, CTRL, isApple ? '^' : 'Ctrl'), Object(defineProperty["a" /* default */])(_replacementKeyMap, COMMAND, '⌘'), Object(defineProperty["a" /* default */])(_replacementKeyMap, SHIFT, isApple ? '⇧' : 'Shift'), _replacementKeyMap);
 439      var modifierKeys = modifier(_isApple).reduce(function (accumulator, key) {
 440        var replacementKey = Object(external_this_lodash_["get"])(replacementKeyMap, key, key); // If on the Mac, adhere to platform convention and don't show plus between keys.
 441  
 442        if (isApple) {
 443          return [].concat(Object(toConsumableArray["a" /* default */])(accumulator), [replacementKey]);
 444        }
 445  
 446        return [].concat(Object(toConsumableArray["a" /* default */])(accumulator), [replacementKey, '+']);
 447      }, []);
 448      var capitalizedCharacter = Object(external_this_lodash_["capitalize"])(character);
 449      return [].concat(Object(toConsumableArray["a" /* default */])(modifierKeys), [capitalizedCharacter]);
 450    };
 451  });
 452  /**
 453   * An object that contains functions to display shortcuts.
 454   * E.g. displayShortcut.primary( 'm' ) will return '⌘M' on Mac.
 455   *
 456   * @type {WPKeycodeHandlerByModifier} Keyed map of functions to display
 457   *                                    shortcuts.
 458   */
 459  
 460  var displayShortcut = Object(external_this_lodash_["mapValues"])(displayShortcutList, function (shortcutList) {
 461    return function (character) {
 462      var _isApple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : isAppleOS;
 463  
 464      return shortcutList(character, _isApple).join('');
 465    };
 466  });
 467  /**
 468   * An object that contains functions to return an aria label for a keyboard shortcut.
 469   * E.g. shortcutAriaLabel.primary( '.' ) will return 'Command + Period' on Mac.
 470   *
 471   * @type {WPKeycodeHandlerByModifier} Keyed map of functions to shortcut ARIA
 472   *                                    labels.
 473   */
 474  
 475  var shortcutAriaLabel = Object(external_this_lodash_["mapValues"])(modifiers, function (modifier) {
 476    return function (character) {
 477      var _replacementKeyMap2;
 478  
 479      var _isApple = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : isAppleOS;
 480  
 481      var isApple = _isApple();
 482  
 483      var replacementKeyMap = (_replacementKeyMap2 = {}, Object(defineProperty["a" /* default */])(_replacementKeyMap2, SHIFT, 'Shift'), Object(defineProperty["a" /* default */])(_replacementKeyMap2, COMMAND, isApple ? 'Command' : 'Control'), Object(defineProperty["a" /* default */])(_replacementKeyMap2, CTRL, 'Control'), Object(defineProperty["a" /* default */])(_replacementKeyMap2, ALT, isApple ? 'Option' : 'Alt'), Object(defineProperty["a" /* default */])(_replacementKeyMap2, ',', Object(external_this_wp_i18n_["__"])('Comma')), Object(defineProperty["a" /* default */])(_replacementKeyMap2, '.', Object(external_this_wp_i18n_["__"])('Period')), Object(defineProperty["a" /* default */])(_replacementKeyMap2, '`', Object(external_this_wp_i18n_["__"])('Backtick')), _replacementKeyMap2);
 484      return [].concat(Object(toConsumableArray["a" /* default */])(modifier(_isApple)), [character]).map(function (key) {
 485        return Object(external_this_lodash_["capitalize"])(Object(external_this_lodash_["get"])(replacementKeyMap, key, key));
 486      }).join(isApple ? ' ' : ' + ');
 487    };
 488  });
 489  /**
 490   * An object that contains functions to check if a keyboard event matches a
 491   * predefined shortcut combination.
 492   * E.g. isKeyboardEvent.primary( event, 'm' ) will return true if the event
 493   * signals pressing ⌘M.
 494   *
 495   * @type {WPKeycodeHandlerByModifier} Keyed map of functions to match events.
 496   */
 497  
 498  var isKeyboardEvent = Object(external_this_lodash_["mapValues"])(modifiers, function (getModifiers) {
 499    return function (event, character) {
 500      var _isApple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : isAppleOS;
 501  
 502      var mods = getModifiers(_isApple);
 503  
 504      if (!mods.every(function (key) {
 505        return event["".concat(key, "Key")];
 506      })) {
 507        return false;
 508      }
 509  
 510      if (!character) {
 511        return Object(external_this_lodash_["includes"])(mods, event.key.toLowerCase());
 512      }
 513  
 514      return event.key === character;
 515    };
 516  });
 517  
 518  
 519  /***/ }),
 520  
 521  /***/ 5:
 522  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 523  
 524  "use strict";
 525  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _defineProperty; });
 526  function _defineProperty(obj, key, value) {
 527    if (key in obj) {
 528      Object.defineProperty(obj, key, {
 529        value: value,
 530        enumerable: true,
 531        configurable: true,
 532        writable: true
 533      });
 534    } else {
 535      obj[key] = value;
 536    }
 537  
 538    return obj;
 539  }
 540  
 541  /***/ })
 542  
 543  /******/ });


Generated: Wed Apr 8 01:00:03 2020 Cross-referenced by PHPXref 0.7.1