timetable2lua

导出轨道交通时刻表数据为Lua对象

Versione datata 15/12/2023. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         timetable2lua
// @namespace    https://dvxg.de/
// @version      0.1.0
// @description  导出轨道交通时刻表数据为Lua对象
// @author       davidxuang
// @match        https://www.cqmetro.cn/smbsj.html
// @homepageURL  https://github.com/davidxuang/timetable2lua
// @icon         https://upload.wikimedia.org/wikipedia/commons/5/5f/BSicon_SUBWAY-CHN.svg
// @license      AGPL-3.0
// @grant        GM_setClipboard
// ==/UserScript==
(() => {
  var __webpack_modules__ = {
    250: module => {
      var clone = function() {
        "use strict";
        function clone(parent, circular, depth, prototype) {
          "object" == typeof circular && (depth = circular.depth, prototype = circular.prototype, 
          circular.filter, circular = circular.circular);
          var allParents = [], allChildren = [], useBuffer = "undefined" != typeof Buffer;
          return void 0 === circular && (circular = !0), void 0 === depth && (depth = 1 / 0), 
          function _clone(parent, depth) {
            if (null === parent) return null;
            if (0 == depth) return parent;
            var child, proto;
            if ("object" != typeof parent) return parent;
            if (clone.__isArray(parent)) child = []; else if (clone.__isRegExp(parent)) child = new RegExp(parent.source, __getRegExpFlags(parent)), 
            parent.lastIndex && (child.lastIndex = parent.lastIndex); else if (clone.__isDate(parent)) child = new Date(parent.getTime()); else {
              if (useBuffer && Buffer.isBuffer(parent)) return child = Buffer.allocUnsafe ? Buffer.allocUnsafe(parent.length) : new Buffer(parent.length), 
              parent.copy(child), child;
              void 0 === prototype ? (proto = Object.getPrototypeOf(parent), child = Object.create(proto)) : (child = Object.create(prototype), 
              proto = prototype);
            }
            if (circular) {
              var index = allParents.indexOf(parent);
              if (-1 != index) return allChildren[index];
              allParents.push(parent), allChildren.push(child);
            }
            for (var i in parent) {
              var attrs;
              proto && (attrs = Object.getOwnPropertyDescriptor(proto, i)), attrs && null == attrs.set || (child[i] = _clone(parent[i], depth - 1));
            }
            return child;
          }(parent, depth);
        }
        function __objToStr(o) {
          return Object.prototype.toString.call(o);
        }
        function __getRegExpFlags(re) {
          var flags = "";
          return re.global && (flags += "g"), re.ignoreCase && (flags += "i"), re.multiline && (flags += "m"), 
          flags;
        }
        return clone.clonePrototype = function(parent) {
          if (null === parent) return null;
          var c = function() {};
          return c.prototype = parent, new c;
        }, clone.__objToStr = __objToStr, clone.__isDate = function(o) {
          return "object" == typeof o && "[object Date]" === __objToStr(o);
        }, clone.__isArray = function(o) {
          return "object" == typeof o && "[object Array]" === __objToStr(o);
        }, clone.__isRegExp = function(o) {
          return "object" == typeof o && "[object RegExp]" === __objToStr(o);
        }, clone.__getRegExpFlags = __getRegExpFlags, clone;
      }();
      module.exports && (module.exports = clone);
    },
    690: (module, __unused_webpack_exports, __webpack_require__) => {
      var clone = __webpack_require__(250);
      module.exports = function(options, defaults) {
        return options = options || {}, Object.keys(defaults).forEach((function(key) {
          void 0 === options[key] && (options[key] = clone(defaults[key]));
        })), options;
      };
    },
    62: module => {
      module.exports = [ [ 768, 879 ], [ 1155, 1158 ], [ 1160, 1161 ], [ 1425, 1469 ], [ 1471, 1471 ], [ 1473, 1474 ], [ 1476, 1477 ], [ 1479, 1479 ], [ 1536, 1539 ], [ 1552, 1557 ], [ 1611, 1630 ], [ 1648, 1648 ], [ 1750, 1764 ], [ 1767, 1768 ], [ 1770, 1773 ], [ 1807, 1807 ], [ 1809, 1809 ], [ 1840, 1866 ], [ 1958, 1968 ], [ 2027, 2035 ], [ 2305, 2306 ], [ 2364, 2364 ], [ 2369, 2376 ], [ 2381, 2381 ], [ 2385, 2388 ], [ 2402, 2403 ], [ 2433, 2433 ], [ 2492, 2492 ], [ 2497, 2500 ], [ 2509, 2509 ], [ 2530, 2531 ], [ 2561, 2562 ], [ 2620, 2620 ], [ 2625, 2626 ], [ 2631, 2632 ], [ 2635, 2637 ], [ 2672, 2673 ], [ 2689, 2690 ], [ 2748, 2748 ], [ 2753, 2757 ], [ 2759, 2760 ], [ 2765, 2765 ], [ 2786, 2787 ], [ 2817, 2817 ], [ 2876, 2876 ], [ 2879, 2879 ], [ 2881, 2883 ], [ 2893, 2893 ], [ 2902, 2902 ], [ 2946, 2946 ], [ 3008, 3008 ], [ 3021, 3021 ], [ 3134, 3136 ], [ 3142, 3144 ], [ 3146, 3149 ], [ 3157, 3158 ], [ 3260, 3260 ], [ 3263, 3263 ], [ 3270, 3270 ], [ 3276, 3277 ], [ 3298, 3299 ], [ 3393, 3395 ], [ 3405, 3405 ], [ 3530, 3530 ], [ 3538, 3540 ], [ 3542, 3542 ], [ 3633, 3633 ], [ 3636, 3642 ], [ 3655, 3662 ], [ 3761, 3761 ], [ 3764, 3769 ], [ 3771, 3772 ], [ 3784, 3789 ], [ 3864, 3865 ], [ 3893, 3893 ], [ 3895, 3895 ], [ 3897, 3897 ], [ 3953, 3966 ], [ 3968, 3972 ], [ 3974, 3975 ], [ 3984, 3991 ], [ 3993, 4028 ], [ 4038, 4038 ], [ 4141, 4144 ], [ 4146, 4146 ], [ 4150, 4151 ], [ 4153, 4153 ], [ 4184, 4185 ], [ 4448, 4607 ], [ 4959, 4959 ], [ 5906, 5908 ], [ 5938, 5940 ], [ 5970, 5971 ], [ 6002, 6003 ], [ 6068, 6069 ], [ 6071, 6077 ], [ 6086, 6086 ], [ 6089, 6099 ], [ 6109, 6109 ], [ 6155, 6157 ], [ 6313, 6313 ], [ 6432, 6434 ], [ 6439, 6440 ], [ 6450, 6450 ], [ 6457, 6459 ], [ 6679, 6680 ], [ 6912, 6915 ], [ 6964, 6964 ], [ 6966, 6970 ], [ 6972, 6972 ], [ 6978, 6978 ], [ 7019, 7027 ], [ 7616, 7626 ], [ 7678, 7679 ], [ 8203, 8207 ], [ 8234, 8238 ], [ 8288, 8291 ], [ 8298, 8303 ], [ 8400, 8431 ], [ 12330, 12335 ], [ 12441, 12442 ], [ 43014, 43014 ], [ 43019, 43019 ], [ 43045, 43046 ], [ 64286, 64286 ], [ 65024, 65039 ], [ 65056, 65059 ], [ 65279, 65279 ], [ 65529, 65531 ], [ 68097, 68099 ], [ 68101, 68102 ], [ 68108, 68111 ], [ 68152, 68154 ], [ 68159, 68159 ], [ 119143, 119145 ], [ 119155, 119170 ], [ 119173, 119179 ], [ 119210, 119213 ], [ 119362, 119364 ], [ 917505, 917505 ], [ 917536, 917631 ], [ 917760, 917999 ] ];
    },
    93: (module, __unused_webpack_exports, __webpack_require__) => {
      "use strict";
      var defaults = __webpack_require__(690), combining = __webpack_require__(62), DEFAULTS = {
        nul: 0,
        control: 0
      };
      function wcswidth(str, opts) {
        if ("string" != typeof str) return wcwidth(str, opts);
        for (var s = 0, i = 0; i < str.length; i++) {
          var n = wcwidth(str.charCodeAt(i), opts);
          if (n < 0) return -1;
          s += n;
        }
        return s;
      }
      function wcwidth(ucs, opts) {
        return 0 === ucs ? opts.nul : ucs < 32 || ucs >= 127 && ucs < 160 ? opts.control : function(ucs) {
          var mid, min = 0, max = combining.length - 1;
          if (ucs < combining[0][0] || ucs > combining[max][1]) return !1;
          for (;max >= min; ) if (mid = Math.floor((min + max) / 2), ucs > combining[mid][1]) min = mid + 1; else {
            if (!(ucs < combining[mid][0])) return !0;
            max = mid - 1;
          }
          return !1;
        }(ucs) ? 0 : 1 + (ucs >= 4352 && (ucs <= 4447 || 9001 == ucs || 9002 == ucs || ucs >= 11904 && ucs <= 42191 && 12351 != ucs || ucs >= 44032 && ucs <= 55203 || ucs >= 63744 && ucs <= 64255 || ucs >= 65040 && ucs <= 65049 || ucs >= 65072 && ucs <= 65135 || ucs >= 65280 && ucs <= 65376 || ucs >= 65504 && ucs <= 65510 || ucs >= 131072 && ucs <= 196605 || ucs >= 196608 && ucs <= 262141));
      }
      module.exports = function(str) {
        return wcswidth(str, DEFAULTS);
      }, module.exports.config = function(opts) {
        return opts = defaults(opts || {}, DEFAULTS), function(str) {
          return wcswidth(str, opts);
        };
      };
    }
  }, __webpack_module_cache__ = {};
  function __webpack_require__(moduleId) {
    var cachedModule = __webpack_module_cache__[moduleId];
    if (void 0 !== cachedModule) return cachedModule.exports;
    var module = __webpack_module_cache__[moduleId] = {
      exports: {}
    };
    return __webpack_modules__[moduleId](module, module.exports, __webpack_require__), 
    module.exports;
  }
  __webpack_require__.n = module => {
    var getter = module && module.__esModule ? () => module.default : () => module;
    return __webpack_require__.d(getter, {
      a: getter
    }), getter;
  }, __webpack_require__.d = (exports, definition) => {
    for (var key in definition) __webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key) && Object.defineProperty(exports, key, {
      enumerable: !0,
      get: definition[key]
    });
  }, __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop), 
  (() => {
    "use strict";
    var wcwidth = __webpack_require__(93), wcwidth_default = __webpack_require__.n(wcwidth);
    function _typeof(obj) {
      return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
        return typeof obj;
      } : function(obj) {
        return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
      }, _typeof(obj);
    }
    var fn, module, _pad, clone_1 = (fn = function(module) {
      var clone = function() {
        function clone(parent, circular, depth, prototype) {
          "object" === _typeof(circular) && (depth = circular.depth, prototype = circular.prototype, 
          circular.filter, circular = circular.circular);
          var allParents = [], allChildren = [], useBuffer = "undefined" != typeof Buffer;
          return void 0 === circular && (circular = !0), void 0 === depth && (depth = 1 / 0), 
          function _clone(parent, depth) {
            if (null === parent) return null;
            if (0 == depth) return parent;
            var child, proto;
            if ("object" != _typeof(parent)) return parent;
            if (clone.__isArray(parent)) child = []; else if (clone.__isRegExp(parent)) child = new RegExp(parent.source, __getRegExpFlags(parent)), 
            parent.lastIndex && (child.lastIndex = parent.lastIndex); else if (clone.__isDate(parent)) child = new Date(parent.getTime()); else {
              if (useBuffer && Buffer.isBuffer(parent)) return child = Buffer.allocUnsafe ? Buffer.allocUnsafe(parent.length) : new Buffer(parent.length), 
              parent.copy(child), child;
              void 0 === prototype ? (proto = Object.getPrototypeOf(parent), child = Object.create(proto)) : (child = Object.create(prototype), 
              proto = prototype);
            }
            if (circular) {
              var index = allParents.indexOf(parent);
              if (-1 != index) return allChildren[index];
              allParents.push(parent), allChildren.push(child);
            }
            for (var i in parent) {
              var attrs;
              proto && (attrs = Object.getOwnPropertyDescriptor(proto, i)), attrs && null == attrs.set || (child[i] = _clone(parent[i], depth - 1));
            }
            return child;
          }(parent, depth);
        }
        function __objToStr(o) {
          return Object.prototype.toString.call(o);
        }
        function __getRegExpFlags(re) {
          var flags = "";
          return re.global && (flags += "g"), re.ignoreCase && (flags += "i"), re.multiline && (flags += "m"), 
          flags;
        }
        return clone.clonePrototype = function(parent) {
          if (null === parent) return null;
          var c = function() {};
          return c.prototype = parent, new c;
        }, clone.__objToStr = __objToStr, clone.__isDate = function(o) {
          return "object" === _typeof(o) && "[object Date]" === __objToStr(o);
        }, clone.__isArray = function(o) {
          return "object" === _typeof(o) && "[object Array]" === __objToStr(o);
        }, clone.__isRegExp = function(o) {
          return "object" === _typeof(o) && "[object RegExp]" === __objToStr(o);
        }, clone.__getRegExpFlags = __getRegExpFlags, clone;
      }();
      module.exports && (module.exports = clone);
    }, fn(module = {
      exports: {}
    }, module.exports), module.exports), combining = [ [ 768, 879 ], [ 1155, 1158 ], [ 1160, 1161 ], [ 1425, 1469 ], [ 1471, 1471 ], [ 1473, 1474 ], [ 1476, 1477 ], [ 1479, 1479 ], [ 1536, 1539 ], [ 1552, 1557 ], [ 1611, 1630 ], [ 1648, 1648 ], [ 1750, 1764 ], [ 1767, 1768 ], [ 1770, 1773 ], [ 1807, 1807 ], [ 1809, 1809 ], [ 1840, 1866 ], [ 1958, 1968 ], [ 2027, 2035 ], [ 2305, 2306 ], [ 2364, 2364 ], [ 2369, 2376 ], [ 2381, 2381 ], [ 2385, 2388 ], [ 2402, 2403 ], [ 2433, 2433 ], [ 2492, 2492 ], [ 2497, 2500 ], [ 2509, 2509 ], [ 2530, 2531 ], [ 2561, 2562 ], [ 2620, 2620 ], [ 2625, 2626 ], [ 2631, 2632 ], [ 2635, 2637 ], [ 2672, 2673 ], [ 2689, 2690 ], [ 2748, 2748 ], [ 2753, 2757 ], [ 2759, 2760 ], [ 2765, 2765 ], [ 2786, 2787 ], [ 2817, 2817 ], [ 2876, 2876 ], [ 2879, 2879 ], [ 2881, 2883 ], [ 2893, 2893 ], [ 2902, 2902 ], [ 2946, 2946 ], [ 3008, 3008 ], [ 3021, 3021 ], [ 3134, 3136 ], [ 3142, 3144 ], [ 3146, 3149 ], [ 3157, 3158 ], [ 3260, 3260 ], [ 3263, 3263 ], [ 3270, 3270 ], [ 3276, 3277 ], [ 3298, 3299 ], [ 3393, 3395 ], [ 3405, 3405 ], [ 3530, 3530 ], [ 3538, 3540 ], [ 3542, 3542 ], [ 3633, 3633 ], [ 3636, 3642 ], [ 3655, 3662 ], [ 3761, 3761 ], [ 3764, 3769 ], [ 3771, 3772 ], [ 3784, 3789 ], [ 3864, 3865 ], [ 3893, 3893 ], [ 3895, 3895 ], [ 3897, 3897 ], [ 3953, 3966 ], [ 3968, 3972 ], [ 3974, 3975 ], [ 3984, 3991 ], [ 3993, 4028 ], [ 4038, 4038 ], [ 4141, 4144 ], [ 4146, 4146 ], [ 4150, 4151 ], [ 4153, 4153 ], [ 4184, 4185 ], [ 4448, 4607 ], [ 4959, 4959 ], [ 5906, 5908 ], [ 5938, 5940 ], [ 5970, 5971 ], [ 6002, 6003 ], [ 6068, 6069 ], [ 6071, 6077 ], [ 6086, 6086 ], [ 6089, 6099 ], [ 6109, 6109 ], [ 6155, 6157 ], [ 6313, 6313 ], [ 6432, 6434 ], [ 6439, 6440 ], [ 6450, 6450 ], [ 6457, 6459 ], [ 6679, 6680 ], [ 6912, 6915 ], [ 6964, 6964 ], [ 6966, 6970 ], [ 6972, 6972 ], [ 6978, 6978 ], [ 7019, 7027 ], [ 7616, 7626 ], [ 7678, 7679 ], [ 8203, 8207 ], [ 8234, 8238 ], [ 8288, 8291 ], [ 8298, 8303 ], [ 8400, 8431 ], [ 12330, 12335 ], [ 12441, 12442 ], [ 43014, 43014 ], [ 43019, 43019 ], [ 43045, 43046 ], [ 64286, 64286 ], [ 65024, 65039 ], [ 65056, 65059 ], [ 65279, 65279 ], [ 65529, 65531 ], [ 68097, 68099 ], [ 68101, 68102 ], [ 68108, 68111 ], [ 68152, 68154 ], [ 68159, 68159 ], [ 119143, 119145 ], [ 119155, 119170 ], [ 119173, 119179 ], [ 119210, 119213 ], [ 119362, 119364 ], [ 917505, 917505 ], [ 917536, 917631 ], [ 917760, 917999 ] ], DEFAULTS = {
      nul: 0,
      control: 0
    }, config = function(opts) {
      var options, _defaults;
      return _defaults = DEFAULTS, options = (options = opts || {}) || {}, Object.keys(_defaults).forEach((function(key) {
        void 0 === options[key] && (options[key] = clone_1(_defaults[key]));
      })), opts = options, function(str) {
        return function(str, opts) {
          if ("string" != typeof str) return pad_esm_wcwidth(str, opts);
          for (var s = 0, i = 0; i < str.length; i++) {
            var n = pad_esm_wcwidth(str.charCodeAt(i), opts);
            if (n < 0) return -1;
            s += n;
          }
          return s;
        }(str, opts);
      };
    };
    function pad_esm_wcwidth(ucs, opts) {
      return 0 === ucs ? opts.nul : ucs < 32 || ucs >= 127 && ucs < 160 ? opts.control : function(ucs) {
        var mid, min = 0, max = combining.length - 1;
        if (ucs < combining[0][0] || ucs > combining[max][1]) return !1;
        for (;max >= min; ) if (mid = Math.floor((min + max) / 2), ucs > combining[mid][1]) min = mid + 1; else {
          if (!(ucs < combining[mid][0])) return !0;
          max = mid - 1;
        }
        return !1;
      }(ucs) ? 0 : 1 + (ucs >= 4352 && (ucs <= 4447 || 9001 == ucs || 9002 == ucs || ucs >= 11904 && ucs <= 42191 && 12351 != ucs || ucs >= 44032 && ucs <= 55203 || ucs >= 63744 && ucs <= 64255 || ucs >= 65040 && ucs <= 65049 || ucs >= 65072 && ucs <= 65135 || ucs >= 65280 && ucs <= 65376 || ucs >= 65504 && ucs <= 65510 || ucs >= 131072 && ucs <= 196605 || ucs >= 196608 && ucs <= 262141));
    }
    const pad_esm = _pad = function(text, length, options) {
      var escapecolor, invert, padlength, textnocolors;
      if (null == options && (options = {}), invert = "number" == typeof text) {
        var _ref = [ text, length ];
        length = _ref[0], text = _ref[1];
      }
      return "string" == typeof options && (options = {
        char: options
      }), null == options.char && (options.char = " "), null == options.strip && (options.strip = !1), 
      "string" != typeof text && (text = text.toString()), textnocolors = null, _pad = "", 
      options.colors && (escapecolor = /\x1B\[(?:[0-9]{1,2}(?:;[0-9]{1,2})?)?[m|K]/g, 
      textnocolors = text.replace(escapecolor, "")), (padlength = options.fixed_width ? length - (textnocolors || text).length : length - config(options.wcwidth_options)(textnocolors || text)) < 0 ? options.strip ? invert ? text.substr(-1 * length) : text.substr(0, length) : text : (_pad += options.char.repeat(padlength), 
      invert ? _pad + text : text + _pad);
    };
    function assert(condition, message = null) {
      if (!condition) throw new Error(message || "Assertion failed");
    }
    function compareNestedStringArray(x, y) {
      return x instanceof Array ? x.length == y.length && 0 == x.filter(((v, i) => !compareNestedStringArray(v, y[i]))).length : x === y;
    }
    function deduplicateDays(timetable) {
      let dedup = !0;
      return timetable.forEach((days => {
        days.length > 1 && days.slice(1).forEach((day => {
          compareNestedStringArray(days[0], day) || (dedup = !1);
        }));
      })), dedup ? new Map(Array.from(timetable.entries()).map((([station, days]) => [ station, [ days[0] ] ]))) : timetable;
    }
    function luaifyNestedStringArray(array, padding = 0) {
      return array instanceof Array ? `{ ${array.map((child => luaifyNestedStringArray(child, padding))).join(", ")} }` : pad_esm(padding, "nil" == array ? "nil" : `'${array}'`);
    }
    function getItemsTextByIndex(items, terminalOffset, dayOffset, closed) {
      return terminalOffset instanceof Array ? terminalOffset.map((index => items[index + dayOffset].innerHTML.trim().replace("--", closed ? "nil" : ""))) : items[terminalOffset + dayOffset].innerHTML.trim().replace("--", closed ? "nil" : "");
    }
    const crt = {
      bootstrap: () => {
        document.querySelectorAll(".line-time-table").forEach((table => {
          let caption = table.querySelector("caption"), button = document.createElement("a");
          button.append("导出"), button.addEventListener("click", (() => {
            let [days, termini, child_termini] = [ 0, 1, 2 ].map((r => Array.from(table.tHead.rows[r].querySelectorAll(".bg-f7f7f7")).filter((th => th.innerText.trim().length > 2))));
            0 == days.length && (days.push(document.createElement("th")), days[0].colSpan = termini.map((g => g.colSpan)).reduce(((p, c) => p + c), 0)), 
            assert([ 1, 2 ].includes(days.length), "Invalid # of days."), assert(termini.length % days.length == 0 && termini.length >= 2, "Invalid # of orientations."), 
            assert(child_termini.length % days.length == 0 && child_termini.length >= 2, "Invalid # of termini.");
            let dayWidth = days[0].colSpan, dayOffsets = [];
            for (let i = 0; i < days.length; i++) assert(days[i].colSpan == dayWidth), dayOffsets.push(i * dayWidth);
            let terminalOffsets = [ 1, 2, 3, 4 ];
            if (termini.length / days.length == 2 && child_termini.length / termini.length == 2) ; else {
              if (!(termini.length / days.length >= 2)) throw termini.length;
              {
                terminalOffsets = [ [], [], [], [] ];
                let i = 0, dayWidth = days[0].colSpan;
                for (var orientation of termini) {
                  let orientationWidth = orientation.colSpan;
                  if (orientation.innerHTML.trim().startsWith("首班车")) for (let j = 0; j < orientationWidth; j++) {
                    let terminusText = child_termini[i + j].innerHTML.trim();
                    terminusText.includes("↓") || terminusText.includes("内环") ? terminalOffsets[0].push(i + j + 1) : terminalOffsets[1].push(i + j + 1);
                  } else for (let j = 0; j < orientationWidth; j++) {
                    let terminusText = child_termini[i + j].innerHTML.trim();
                    terminusText.includes("↓") || terminusText.includes("内环") ? terminalOffsets[2].push(i + j + 1) : terminalOffsets[3].push(i + j + 1);
                  }
                  if (i += orientationWidth, i >= dayWidth) break;
                }
                for (let i = 0; i < terminalOffsets.length; i++) terminalOffsets[i] = 1 == terminalOffsets[i].length ? terminalOffsets[i][0] : terminalOffsets[i];
              }
            }
            let rows = Array.from(table.tBodies[0].rows).map((row => Array.from(row.cells))), timetable = new Map;
            for (var row of rows) {
              if (0 == row.length) break;
              let name = row[0].innerHTML.trim().replace("航站楼", "");
              if (!name || "--" == name) break;
              timetable.set(name, dayOffsets.map((dayOffset => {
                let closed = 0 == row.slice(1).filter((cell => cell.innerHTML.trim().length > 2)).length;
                return [ [ getItemsTextByIndex(row, terminalOffsets[0], dayOffset, closed), getItemsTextByIndex(row, terminalOffsets[1], dayOffset, closed) ], [ getItemsTextByIndex(row, terminalOffsets[2], dayOffset, closed), getItemsTextByIndex(row, terminalOffsets[3], dayOffset, closed) ] ];
              })));
            }
            navigator.clipboard.writeText(function(timetable, padding) {
              return `\t\t{\n\t\t\tstations = ${luaifyNestedStringArray([ ...(timetable = deduplicateDays(timetable)).keys() ])},\n\t\t\tdata = {\n${Array.from(timetable).map((([key, value]) => `\t\t\t\t${pad_esm(`['${key}']`, padding)} = ${luaifyNestedStringArray(value, 7)},`)).join("\n")}\n\t\t\t}\n\t\t}`;
            }(timetable, Math.max(...[ ...timetable.keys() ].map((str => wcwidth_default()(str)))) + 4));
          }), !1), button.style.cursor = "pointer", button.style.position = "absolute", button.style["z-index"] = 1, 
          button.style.color = "white", button.style.opacity = ".75", button.style["padding-inline-start"] = ".5em", 
          caption.appendChild(button);
        }));
      }
    };
    if ("www.cqmetro.cn" === new URL(document.URL).hostname) crt.bootstrap();
  })();
})();