timetable2lua

Export timetable data as lua table.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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;
  }

})();