timetable2lua

Export timetable data as lua table.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         timetable2lua
// @namespace    https://dvxg.de/
// @version      0.1.3
// @author       davidxuang
// @description  Export timetable data as lua table.
// @license      AGPL-3.0-only
// @icon         https://cdn.jsdelivr.net/gh/microsoft/fluentui-emoji/assets/Metro/3D/metro_3d.png
// @homepage     https://github.com/davidxuang/timetable2lua
// @homepageURL  https://github.com/davidxuang/timetable2lua
// @match        https://www.cqmetro.cn/smbsj.html
// ==/UserScript==

(function () {
  'use strict';

  function getDefaultExportFromCjs(x) {
    return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
  }
  var wcwidth$3 = { exports: {} };
  var clone$1 = { exports: {} };
  (function(module) {
    var clone2 = function() {
      function clone3(parent, circular, depth, prototype) {
        if (typeof circular === "object") {
          depth = circular.depth;
          prototype = circular.prototype;
          circular.filter;
          circular = circular.circular;
        }
        var allParents = [];
        var allChildren = [];
        var useBuffer = typeof Buffer != "undefined";
        if (typeof circular == "undefined")
          circular = true;
        if (typeof depth == "undefined")
          depth = Infinity;
        function _clone(parent2, depth2) {
          if (parent2 === null)
            return null;
          if (depth2 == 0)
            return parent2;
          var child;
          var proto;
          if (typeof parent2 != "object") {
            return parent2;
          }
          if (clone3.__isArray(parent2)) {
            child = [];
          } else if (clone3.__isRegExp(parent2)) {
            child = new RegExp(parent2.source, __getRegExpFlags(parent2));
            if (parent2.lastIndex)
              child.lastIndex = parent2.lastIndex;
          } else if (clone3.__isDate(parent2)) {
            child = new Date(parent2.getTime());
          } else if (useBuffer && Buffer.isBuffer(parent2)) {
            if (Buffer.allocUnsafe) {
              child = Buffer.allocUnsafe(parent2.length);
            } else {
              child = new Buffer(parent2.length);
            }
            parent2.copy(child);
            return child;
          } else {
            if (typeof prototype == "undefined") {
              proto = Object.getPrototypeOf(parent2);
              child = Object.create(proto);
            } else {
              child = Object.create(prototype);
              proto = prototype;
            }
          }
          if (circular) {
            var index = allParents.indexOf(parent2);
            if (index != -1) {
              return allChildren[index];
            }
            allParents.push(parent2);
            allChildren.push(child);
          }
          for (var i in parent2) {
            var attrs;
            if (proto) {
              attrs = Object.getOwnPropertyDescriptor(proto, i);
            }
            if (attrs && attrs.set == null) {
              continue;
            }
            child[i] = _clone(parent2[i], depth2 - 1);
          }
          return child;
        }
        return _clone(parent, depth);
      }
      clone3.clonePrototype = function clonePrototype(parent) {
        if (parent === null)
          return null;
        var c = function() {
        };
        c.prototype = parent;
        return new c();
      };
      function __objToStr(o) {
        return Object.prototype.toString.call(o);
      }
      clone3.__objToStr = __objToStr;
      function __isDate(o) {
        return typeof o === "object" && __objToStr(o) === "[object Date]";
      }
      clone3.__isDate = __isDate;
      function __isArray(o) {
        return typeof o === "object" && __objToStr(o) === "[object Array]";
      }
      clone3.__isArray = __isArray;
      function __isRegExp(o) {
        return typeof o === "object" && __objToStr(o) === "[object RegExp]";
      }
      clone3.__isRegExp = __isRegExp;
      function __getRegExpFlags(re) {
        var flags = "";
        if (re.global)
          flags += "g";
        if (re.ignoreCase)
          flags += "i";
        if (re.multiline)
          flags += "m";
        return flags;
      }
      clone3.__getRegExpFlags = __getRegExpFlags;
      return clone3;
    }();
    if (module.exports) {
      module.exports = clone2;
    }
  })(clone$1);
  var cloneExports = clone$1.exports;
  var clone = cloneExports;
  var defaults$2 = function(options, defaults3) {
    options = options || {};
    Object.keys(defaults3).forEach(function(key) {
      if (typeof options[key] === "undefined") {
        options[key] = clone(defaults3[key]);
      }
    });
    return options;
  };
  var combining$2 = [
    [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]
  ];
  var defaults$1 = defaults$2;
  var combining$1 = combining$2;
  var DEFAULTS$1 = {
    nul: 0,
    control: 0
  };
  wcwidth$3.exports = function wcwidth(str) {
    return wcswidth$1(str, DEFAULTS$1);
  };
  wcwidth$3.exports.config = function(opts) {
    opts = defaults$1(opts || {}, DEFAULTS$1);
    return function wcwidth3(str) {
      return wcswidth$1(str, opts);
    };
  };
  function wcswidth$1(str, opts) {
    if (typeof str !== "string")
      return wcwidth$1(str, opts);
    var s = 0;
    for (var i = 0; i < str.length; i++) {
      var n = wcwidth$1(str.charCodeAt(i), opts);
      if (n < 0)
        return -1;
      s += n;
    }
    return s;
  }
  function wcwidth$1(ucs, opts) {
    if (ucs === 0)
      return opts.nul;
    if (ucs < 32 || ucs >= 127 && ucs < 160)
      return opts.control;
    if (bisearch$1(ucs))
      return 0;
    return 1 + (ucs >= 4352 && (ucs <= 4447 || // Hangul Jamo init. consonants
    ucs == 9001 || ucs == 9002 || ucs >= 11904 && ucs <= 42191 && ucs != 12351 || // CJK ... Yi
    ucs >= 44032 && ucs <= 55203 || // Hangul Syllables
    ucs >= 63744 && ucs <= 64255 || // CJK Compatibility Ideographs
    ucs >= 65040 && ucs <= 65049 || // Vertical forms
    ucs >= 65072 && ucs <= 65135 || // CJK Compatibility Forms
    ucs >= 65280 && ucs <= 65376 || // Fullwidth Forms
    ucs >= 65504 && ucs <= 65510 || ucs >= 131072 && ucs <= 196605 || ucs >= 196608 && ucs <= 262141));
  }
  function bisearch$1(ucs) {
    var min = 0;
    var max = combining$1.length - 1;
    var mid;
    if (ucs < combining$1[0][0] || ucs > combining$1[max][1])
      return false;
    while (max >= min) {
      mid = Math.floor((min + max) / 2);
      if (ucs > combining$1[mid][1])
        min = mid + 1;
      else if (ucs < combining$1[mid][0])
        max = mid - 1;
      else
        return true;
    }
    return false;
  }
  var wcwidthExports = wcwidth$3.exports;
  const wcwidth$2 = /* @__PURE__ */ getDefaultExportFromCjs(wcwidthExports);
  function _typeof(obj) {
    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
      _typeof = function(obj2) {
        return typeof obj2;
      };
    } else {
      _typeof = function(obj2) {
        return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
      };
    }
    return _typeof(obj);
  }
  function createCommonjsModule(fn, module) {
    return module = { exports: {} }, fn(module, module.exports), module.exports;
  }
  var clone_1 = createCommonjsModule(function(module) {
    var clone2 = function() {
      function clone3(parent, circular, depth, prototype) {
        if (_typeof(circular) === "object") {
          depth = circular.depth;
          prototype = circular.prototype;
          circular.filter;
          circular = circular.circular;
        }
        var allParents = [];
        var allChildren = [];
        var useBuffer = typeof Buffer != "undefined";
        if (typeof circular == "undefined")
          circular = true;
        if (typeof depth == "undefined")
          depth = Infinity;
        function _clone(parent2, depth2) {
          if (parent2 === null)
            return null;
          if (depth2 == 0)
            return parent2;
          var child;
          var proto;
          if (_typeof(parent2) != "object") {
            return parent2;
          }
          if (clone3.__isArray(parent2)) {
            child = [];
          } else if (clone3.__isRegExp(parent2)) {
            child = new RegExp(parent2.source, __getRegExpFlags(parent2));
            if (parent2.lastIndex)
              child.lastIndex = parent2.lastIndex;
          } else if (clone3.__isDate(parent2)) {
            child = new Date(parent2.getTime());
          } else if (useBuffer && Buffer.isBuffer(parent2)) {
            if (Buffer.allocUnsafe) {
              child = Buffer.allocUnsafe(parent2.length);
            } else {
              child = new Buffer(parent2.length);
            }
            parent2.copy(child);
            return child;
          } else {
            if (typeof prototype == "undefined") {
              proto = Object.getPrototypeOf(parent2);
              child = Object.create(proto);
            } else {
              child = Object.create(prototype);
              proto = prototype;
            }
          }
          if (circular) {
            var index = allParents.indexOf(parent2);
            if (index != -1) {
              return allChildren[index];
            }
            allParents.push(parent2);
            allChildren.push(child);
          }
          for (var i in parent2) {
            var attrs;
            if (proto) {
              attrs = Object.getOwnPropertyDescriptor(proto, i);
            }
            if (attrs && attrs.set == null) {
              continue;
            }
            child[i] = _clone(parent2[i], depth2 - 1);
          }
          return child;
        }
        return _clone(parent, depth);
      }
      clone3.clonePrototype = function clonePrototype(parent) {
        if (parent === null)
          return null;
        var c = function c2() {
        };
        c.prototype = parent;
        return new c();
      };
      function __objToStr(o) {
        return Object.prototype.toString.call(o);
      }
      clone3.__objToStr = __objToStr;
      function __isDate(o) {
        return _typeof(o) === "object" && __objToStr(o) === "[object Date]";
      }
      clone3.__isDate = __isDate;
      function __isArray(o) {
        return _typeof(o) === "object" && __objToStr(o) === "[object Array]";
      }
      clone3.__isArray = __isArray;
      function __isRegExp(o) {
        return _typeof(o) === "object" && __objToStr(o) === "[object RegExp]";
      }
      clone3.__isRegExp = __isRegExp;
      function __getRegExpFlags(re) {
        var flags = "";
        if (re.global)
          flags += "g";
        if (re.ignoreCase)
          flags += "i";
        if (re.multiline)
          flags += "m";
        return flags;
      }
      clone3.__getRegExpFlags = __getRegExpFlags;
      return clone3;
    }();
    if (module.exports) {
      module.exports = clone2;
    }
  });
  var defaults = function defaults2(options, _defaults) {
    options = options || {};
    Object.keys(_defaults).forEach(function(key) {
      if (typeof options[key] === "undefined") {
        options[key] = clone_1(_defaults[key]);
      }
    });
    return options;
  };
  var 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]];
  var DEFAULTS = {
    nul: 0,
    control: 0
  };
  var config = function config2(opts) {
    opts = defaults(opts || {}, DEFAULTS);
    return function wcwidth3(str) {
      return wcswidth(str, opts);
    };
  };
  function wcswidth(str, opts) {
    if (typeof str !== "string")
      return wcwidth2(str, opts);
    var s = 0;
    for (var i = 0; i < str.length; i++) {
      var n = wcwidth2(str.charCodeAt(i), opts);
      if (n < 0)
        return -1;
      s += n;
    }
    return s;
  }
  function wcwidth2(ucs, opts) {
    if (ucs === 0)
      return opts.nul;
    if (ucs < 32 || ucs >= 127 && ucs < 160)
      return opts.control;
    if (bisearch(ucs))
      return 0;
    return 1 + (ucs >= 4352 && (ucs <= 4447 || // Hangul Jamo init. consonants
    ucs == 9001 || ucs == 9002 || ucs >= 11904 && ucs <= 42191 && ucs != 12351 || // CJK ... Yi
    ucs >= 44032 && ucs <= 55203 || // Hangul Syllables
    ucs >= 63744 && ucs <= 64255 || // CJK Compatibility Ideographs
    ucs >= 65040 && ucs <= 65049 || // Vertical forms
    ucs >= 65072 && ucs <= 65135 || // CJK Compatibility Forms
    ucs >= 65280 && ucs <= 65376 || // Fullwidth Forms
    ucs >= 65504 && ucs <= 65510 || ucs >= 131072 && ucs <= 196605 || ucs >= 196608 && ucs <= 262141));
  }
  function bisearch(ucs) {
    var min = 0;
    var max = combining.length - 1;
    var mid;
    if (ucs < combining[0][0] || ucs > combining[max][1])
      return false;
    while (max >= min) {
      mid = Math.floor((min + max) / 2);
      if (ucs > combining[mid][1])
        min = mid + 1;
      else if (ucs < combining[mid][0])
        max = mid - 1;
      else
        return true;
    }
    return false;
  }
  var _pad;
  _pad = function pad(text, length, options) {
    var escapecolor, invert, padlength, textnocolors;
    if (options == null) {
      options = {};
    }
    invert = typeof text === "number";
    if (invert) {
      var _ref = [text, length];
      length = _ref[0];
      text = _ref[1];
    }
    if (typeof options === "string") {
      options = {
        "char": options
      };
    }
    if (options["char"] == null) {
      options["char"] = " ";
    }
    if (options.strip == null) {
      options.strip = false;
    }
    if (typeof text !== "string") {
      text = text.toString();
    }
    textnocolors = null;
    _pad = "";
    if (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);
    if (padlength < 0) {
      if (options.strip) {
        if (invert) {
          return text.substr(length * -1);
        } else {
          return text.substr(0, length);
        }
      }
      return text;
    }
    _pad += options["char"].repeat(padlength);
    if (invert) {
      return _pad + text;
    } else {
      return text + _pad;
    }
  };
  var _pad$1 = _pad;
  function assert(condition, message) {
    if (!condition) {
      throw new Error(message || "Assertion failed");
    }
  }
  function compareNestedStringArray(x, y) {
    if (x instanceof Array) {
      if (x.length != y.length) {
        return false;
      } else {
        return x.filter((v, i) => !compareNestedStringArray(v, y[i])).length == 0;
      }
    } else {
      return x === y;
    }
  }
  function deduplicateDays(timetable) {
    let dedup = true;
    timetable.forEach((days) => {
      if (days.length > 1) {
        days.slice(1).forEach((day) => {
          if (!compareNestedStringArray(days[0], day)) {
            dedup = false;
          }
        });
      }
    });
    if (dedup) {
      return new Map(
        Array.from(timetable.entries()).map(([station, days]) => [
          station,
          [days[0]]
        ])
      );
    } else {
      return timetable;
    }
  }
  function luaifyNestedStringArray(array, padding = 0) {
    if (array instanceof Array) {
      return `{ ${array.map((child) => luaifyNestedStringArray(child, padding)).join(", ")} }`;
    } else if (array == "nil") {
      return _pad$1(padding, `nil`);
    } else {
      return _pad$1(padding, `'${array}'`);
    }
  }
  function luaifyTimetable(timetable, padding) {
    timetable = deduplicateDays(timetable);
    return `
			stations = ${luaifyNestedStringArray([...timetable.keys()])},
			data = {
${Array.from(timetable).map(
    ([key, value]) => `				${_pad$1(`['${key}']`, padding)} = ${luaifyNestedStringArray(value, 7)},`
  ).join("\n")}
			}`;
  }
  function getItemsTextByIndex(items, terminalOffset, dayOffset, closed) {
    if (terminalOffset instanceof Array) {
      return terminalOffset.map(
        (index) => items[index + dayOffset].innerHTML.trim().replace("--", closed ? "nil" : "")
      );
    } else {
      return items[terminalOffset + dayOffset].innerHTML.trim().replace("--", closed ? "nil" : "");
    }
  }
  const CRT = {
    bootstrap: () => {
      document.querySelectorAll(".line-time-table").forEach((table) => {
        let caption = table.querySelector("caption");
        let copyData = () => {
          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)
          );
          if (days.length == 0) {
            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 termini."
          );
          assert(
            child_termini.length % days.length == 0 && child_termini.length >= 2,
            "Invalid # of child termini."
          );
          let dayWidth = days[0].colSpan;
          let 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) {
            terminalOffsets = [[], [], [], []];
            let i = 0;
            let dayWidth2 = 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();
                  if (terminusText.includes("↓") || terminusText.includes("内环")) {
                    terminalOffsets[0].push(i + j + 1);
                  } else {
                    terminalOffsets[1].push(i + j + 1);
                  }
                }
              } else {
                for (let j = 0; j < orientationWidth; j++) {
                  let terminusText = child_termini[i + j].innerHTML.trim();
                  if (terminusText.includes("↓") || terminusText.includes("内环")) {
                    terminalOffsets[2].push(i + j + 1);
                  } else {
                    terminalOffsets[3].push(i + j + 1);
                  }
                }
              }
              i += orientationWidth;
              if (i >= dayWidth2) {
                break;
              }
            }
            for (let i2 = 0; i2 < terminalOffsets.length; i2++) {
              const v = terminalOffsets[i2];
              terminalOffsets[i2] = v instanceof Array && v.length == 1 ? v[0] : v;
            }
          } else {
            throw termini.length;
          }
          let rows = Array.from(table.tBodies[0].rows).map(
            (row2) => Array.from(row2.cells)
          );
          let timetable = /* @__PURE__ */ new Map();
          for (var row of rows) {
            if (row.length == 0) {
              break;
            }
            let name = row[0].innerHTML.trim().replace("航站楼", "");
            if (!name || name == "--") {
              break;
            }
            timetable.set(
              name,
              dayOffsets.map((dayOffset) => {
                let closed = (
                  // 判断车站是否关闭
                  row.slice(1).filter((cell) => cell.innerHTML.trim().length > 2).length == 0
                );
                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(
            luaifyTimetable(
              timetable,
              Math.max(...[...timetable.keys()].map((str) => wcwidth$2(str))) + 4
            )
          );
        };
        let button = document.createElement("a");
        button.append("导出");
        button.addEventListener("click", copyData, false);
        button.style.cursor = "pointer";
        button.style.position = "absolute";
        button.style.zIndex = "1";
        button.style.color = "white";
        button.style.opacity = ".75";
        button.style.paddingInlineStart = ".5em";
        caption?.appendChild(button);
      });
    }
  };
  switch (new URL(document.URL).hostname) {
    case "www.cqmetro.cn":
      CRT.bootstrap();
      break;
  }

})();