{"version":3,"file":"index.cjs","sources":["../src/context.ts","../src/tokenizer.ts","../src/episodes.ts","../src/keyword.ts","../src/title.ts","../src/parser.ts"],"sourcesContent":["import type { ParseOptions, ParseResult } from './types';\n\nimport { Token } from './tokenizer';\n\nexport class Context {\n  // Left cursor for consumed tokens\n  public left = 0;\n\n  // Right cursor for consumed tokens\n  public right;\n\n  public tokens: Token[];\n\n  public options: ParseOptions;\n\n  public result: Partial<ParseResult>;\n\n  public tags: string[];\n\n  public constructor(tokens: Token[], options: ParseOptions) {\n    this.tokens = tokens;\n    this.options = options;\n    this.right = tokens.length - 1;\n    this.tags = [];\n    this.result = {};\n  }\n\n  public update<K1 extends keyof ParseResult>(key: K1, value: ParseResult[K1]) {\n    this.result[key] = value;\n  }\n\n  public update2<\n    K1 extends keyof Required<ParseResult>,\n    K2 extends keyof Required<ParseResult>[K1]\n  >(key1: K1, key2: K2, value: Required<ParseResult>[K1][K2]) {\n    if (!this.result[key1]) {\n      // @ts-expect-error\n      this.result[key1] = {};\n    }\n    // @ts-expect-error\n    this.result[key1][key2] = value;\n  }\n\n  public update3<\n    K1 extends keyof Required<ParseResult>,\n    K2 extends keyof Required<ParseResult>[K1],\n    K3 extends keyof Required<Required<ParseResult>[K1]>[K2]\n  >(key1: K1, key2: K2, key3: K3, value: Required<Required<ParseResult>[K1]>[K2][K3]) {\n    if (!this.result[key1]) {\n      // @ts-expect-error\n      this.result[key1] = {};\n    }\n    // @ts-expect-error\n    if (!this.result[key1][key2]) {\n      // @ts-expect-error\n      this.result[key1][key2] = {};\n    }\n    // @ts-expect-error\n    this.result[key1][key2][key3] = value;\n  }\n\n  public get hasEpisode() {\n    return this.result.episode || this.result.episodes || this.result.episodeRange;\n  }\n\n  public validate(): ParseResult | undefined {\n    this.result.tags = this.tags;\n    return this.result as ParseResult;\n  }\n}\n","export class Token {\n  public readonly text: string;\n\n  public readonly left: string | undefined;\n\n  public readonly right: string | undefined;\n\n  public constructor(text: string, left?: string, right?: string) {\n    this.text = text;\n    this.left = left;\n    this.right = right;\n  }\n\n  public get isWrapped() {\n    return this.left && this.right;\n  }\n\n  public slice(start: number, end?: number) {\n    const text = this.text.slice(start, end);\n    return new Token(text, this.left, this.right);\n  }\n\n  public trim() {\n    const text = this.text.trim();\n    return new Token(text, this.left, this.right);\n  }\n\n  public toString() {\n    return `${this.left ?? ''}${this.text}${this.right ?? ''}`;\n  }\n}\n\nexport const Wrappers = new Map([\n  ['[', ']'],\n  ['【', '】'],\n  ['(', ')'],\n  ['（', '）'],\n  ['{', '}']\n]);\n\nexport const RevWrappers = new Map([...Wrappers.entries()].map(([k, v]) => [v, k]));\n\nexport function tokenize(text: string) {\n  const tokens: Token[] = [];\n\n  let cursor = 0;\n  let cur = '';\n  let left: string | undefined = undefined;\n  let right: string | undefined = undefined;\n  while (cursor < text.length) {\n    const char = text[cursor];\n    if (Wrappers.has(char)) {\n      if (!left) {\n        if (cur) {\n          tokens.push(new Token(cur.trim()));\n          cur = '';\n        }\n        left = char;\n        right = Wrappers.get(char)!;\n      } else {\n        // nest wrapper\n        cur += char;\n      }\n    } else if (left && right && char === right) {\n      tokens.push(new Token(cur.trim(), left, right));\n      cur = '';\n      left = undefined;\n      right = undefined;\n    } else {\n      cur += char;\n    }\n    cursor += 1;\n  }\n  if (cur) {\n    tokens.push(new Token(cur.trim()));\n  }\n\n  return tokens.filter((t) => t.text);\n}\n","import { Context } from './context';\n\nconst WrappedEpisodeRE = /^(?<ep1>\\d+)(?:\\.(\\d))?(?:[vV](\\d+))?$|^第(?<ep2>\\d+)[集话話]$/;\nconst WrappedMovieRE = /^Movie [vV](\\d+)$/;\n\nconst EpisodesRange1 = /^(\\d+)-(\\d+)(?:\\s*.*)$/;\nconst EpisodesRange2 = /^全(\\d+)集$/;\n\nexport function parseWrappedEpisodes(ctx: Context) {\n  const token = ctx.tokens[ctx.right];\n  const text = token.text;\n  if (token.isWrapped && matchEpiodes(ctx, text)) {\n    ctx.right -= 1;\n    return true;\n  }\n  return false;\n}\n\nexport function matchEpiodes(ctx: Context, text: string) {\n  // 1. Single episode\n  {\n    const res = WrappedEpisodeRE.exec(text);\n    if (res) {\n      const epText = res.groups?.ep1! || res.groups?.ep2!;\n      const ep = +epText;\n      if (!Number.isNaN(ep)) {\n        // Handle year: [2024]\n        if (1949 <= ep && ep <= 2099 && text === epText && ctx.hasEpisode) {\n          ctx.update('year', ep);\n          return true;\n        }\n\n        ctx.update2('episode', 'number', ep);\n        // 1.5\n        if (res[2] && !Number.isNaN(res[2])) {\n          ctx.update2('episode', 'numberSub', +res[2]);\n        }\n        // 3v2\n        if (res[3] && !Number.isNaN(res[3])) {\n          ctx.update('version', +res[3]);\n        }\n        return true;\n      }\n    }\n  }\n  {\n    // [Movie] / [Movie v2]\n    const res = WrappedMovieRE.exec(text);\n    if (res) {\n      if (res[1] && !Number.isNaN(res[1])) {\n        ctx.update('version', +res[1]);\n      }\n      ctx.update('type', 'Movie');\n      return true;\n    }\n  }\n\n  // 2. Episode range\n  {\n    // 01-26\n    const res = EpisodesRange1.exec(text);\n    if (res) {\n      const from = +res[1];\n      const to = +res[2];\n      if (!Number.isNaN(from) && !Number.isNaN(to)) {\n        ctx.update2('episodeRange', 'from', from);\n        ctx.update2('episodeRange', 'to', to);\n        return true;\n      }\n    }\n  }\n  {\n    // 全26集\n    const res = EpisodesRange2.exec(text);\n    if (res) {\n      const to = +res[1];\n      if (!Number.isNaN(to)) {\n        ctx.update2('episodeRange', 'from', 1);\n        ctx.update2('episodeRange', 'to', to);\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nconst SuffixEpisodeRE = [/- (\\d+)(?:\\.(\\d))?$/, /第(\\d+)(?:\\.(\\d))?[集话話]$/];\n\nexport function parseSuffixEpisodes(ctx: Context) {\n  if (ctx.result.episode || ctx.result.episodes || ctx.result.episodeRange) {\n    return true;\n  }\n\n  const token = ctx.tokens[ctx.right];\n  const text = token.text;\n  for (const RE of SuffixEpisodeRE) {\n    const res = RE.exec(text);\n    if (res) {\n      const ep = +res[1];\n      if (!Number.isNaN(ep)) {\n        ctx.update2('episode', 'number', ep);\n\n        // 1.5\n        if (res[2] && !Number.isNaN(res[2])) {\n          ctx.update2('episode', 'numberSub', +res[2]);\n        }\n\n        // Remove token suffix\n        ctx.tokens[ctx.right] = token.slice(0, text.length - res[0].length).trim();\n\n        return true;\n      }\n    }\n  }\n}\n\n// Season regexp\nexport const SuffixSeasonOrEpisodesRes: Array<\n  [RegExp, (res: RegExpExecArray, ctx: Context) => boolean]\n> = [\n  [\n    /(?:S|Season\\s?)(\\d+)$/,\n    (res, ctx) => {\n      const season = +res[1];\n      if (!Number.isNaN(season)) {\n        if (!ctx.result.season?.number || ctx.result.season.number === season) {\n          ctx.update2('season', 'number', season);\n          return true;\n        }\n      }\n      return false;\n    }\n  ],\n  [\n    /(1st|2nd|3rd|[456789]th) Season$/,\n    (res, ctx) => {\n      const season = Number.parseInt(res[1]);\n      if (!Number.isNaN(season)) {\n        if (!ctx.result.season?.number || ctx.result.season.number === season) {\n          ctx.update2('season', 'number', season);\n          return true;\n        }\n      }\n      return false;\n    }\n  ],\n  [\n    /第?(\\d+)[季期]$/,\n    (res, ctx) => {\n      const season = +res[1];\n      if (!Number.isNaN(season)) {\n        if (!ctx.result.season?.number || ctx.result.season.number === season) {\n          ctx.update2('season', 'number', season);\n          return true;\n        }\n      }\n      return false;\n    }\n  ],\n  [\n    /第?((?:[零一二三四五六七八九]十)?[零一二三四五六七八九])[季期]$/,\n    (res, ctx) => {\n      const text = res[1];\n      const map = {\n        零: 0,\n        一: 1,\n        二: 2,\n        三: 3,\n        四: 4,\n        五: 5,\n        六: 6,\n        七: 7,\n        八: 8,\n        九: 9\n      };\n      const base =\n        text.length === 2 && text[0] === '十'\n          ? 1\n          : text.length === 3\n            ? map[text[0] as keyof typeof map]!\n            : 0;\n      const offset = map[text[text.length - 1] as keyof typeof map];\n      const season = base * 10 + offset;\n      if (!ctx.result.season?.number || ctx.result.season.number === season) {\n        ctx.update2('season', 'number', season);\n        return true;\n      }\n      return false;\n    }\n  ],\n  [\n    / (\\d+)$/,\n    (res, ctx) => {\n      const season = +res[1];\n      if (\n        !Number.isNaN(season) &&\n        (ctx.result.episode || ctx.result.episodes || ctx.result.episodeRange)\n      ) {\n        // Skip: Part 2\n        if (/Parts? \\d+$/.test(res.input)) {\n          return false;\n        }\n        if (!ctx.result.season?.number || ctx.result.season.number === season) {\n          ctx.update2('season', 'number', season);\n          return true;\n        }\n      }\n      return false;\n    }\n  ],\n  [\n    /(?<ep1>\\d+)(?:\\.(\\d))?(?:[vV](\\d+))?$|^第(?<ep2>\\d+)[集话話]$/,\n    (res, ctx) => {\n      const ep = +(res.groups?.ep1! || res.groups?.ep2!);\n      if (!Number.isNaN(ep)) {\n        // Skip: Part 2\n        if (/Parts? \\d+$/.test(res.input)) {\n          return false;\n        }\n\n        ctx.update2('episode', 'number', ep);\n        // 1.5\n        if (res[2] && !Number.isNaN(res[2])) {\n          ctx.update2('episode', 'numberSub', +res[2]);\n        }\n        // 3v2\n        if (res[3] && !Number.isNaN(res[3])) {\n          ctx.update('version', +res[3]);\n        }\n        return true;\n      }\n      return false;\n    }\n  ],\n  [\n    /（日配版）$/,\n    (res, ctx) => {\n      ctx.update('language', res[0]);\n      return true;\n    }\n  ],\n  [\n    /（重播）$/,\n    (res, ctx) => {\n      ctx.tags.push(res[0]);\n      return true;\n    }\n  ]\n];\n","import { Context } from './context';\nimport { RevWrappers, Token } from './tokenizer';\nimport { matchEpiodes, SuffixSeasonOrEpisodesRes } from './episodes';\n\nconst AudioTerm = new Set([\n  // Audio channels\n  '2.0CH',\n  '2CH',\n  '5.1',\n  '5.1CH',\n  'DTS',\n  'DTS-ES',\n  'DTS5.1',\n  'TRUEHD5.1',\n  // Audio codec\n  'AAC',\n  'AACX2',\n  'AAC×2',\n  'AACX3',\n  'AAC×3',\n  'AACX4',\n  'AAC×4',\n  'AC3',\n  'EAC3',\n  'E-AC-3',\n  'FLAC',\n  'FLACX2',\n  'FLAC×2',\n  'FLACX3',\n  'FLAC×3',\n  'FLACX4',\n  'FLAC×4',\n  'LOSSLESS',\n  'MP3',\n  'WAV',\n  'OGG',\n  'VORBIS',\n  // Audio language\n  'DUALAUDIO',\n  'DUAL AUDIO'\n]);\n\nconst VideoTerm = new Set([\n  // Frame rate\n  '23.976FPS',\n  '24FPS',\n  '29.97FPS',\n  '30FPS',\n  '60FPS',\n  '120FPS',\n  // Video codec\n  '8BIT',\n  '8-BIT',\n  '10BIT',\n  '10BITS',\n  '10-BIT',\n  '10-BITS',\n  'HI10',\n  'HI10P',\n  'HI444',\n  'HI444P',\n  'HI444PP',\n  'H264',\n  'H265',\n  'H.264',\n  'H.265',\n  'X264',\n  'X265',\n  'X.264',\n  'AVC',\n  'HEVC',\n  'HEVC2',\n  'HEVC_OPUS',\n  'HEVC-10BIT',\n  'HEVC_10BIT',\n  'HEVC-8BIT',\n  'HEVC_8BIT',\n  'DIVX',\n  'DIVX5',\n  'DIVX6',\n  'XVID',\n  // Video format\n  'AVI',\n  'RMVB',\n  'WMV',\n  'WMV3',\n  'WMV9',\n  // Video quality\n  'HDR',\n  'HQ',\n  'LQ',\n  // Video resolution\n  'HD',\n  'SD'\n]);\n\nconst VideoResolution = new Set([\n  '480P',\n  '720P',\n  '1080P',\n  '2160P',\n  'AI2160p',\n  '1280X720',\n  '1280×720',\n  '1920X816',\n  '1920×816',\n  '1920X1080',\n  '1920×1080',\n  '2K',\n  '4K'\n]);\n\nconst Source = new Set([\n  'BD',\n  'BDRIP',\n  'BLURAY',\n  'BLU-RAY',\n  'BDREMUX',\n  'UHDBDRIP',\n  'DVD',\n  'DVD5',\n  'DVD9',\n  'DVD-R2J',\n  'DVDRIP',\n  'DVD-RIP',\n  'R2DVD',\n  'R2J',\n  'R2JDVD',\n  'R2JDVDRIP',\n  'HDTV',\n  'HDTVRIP',\n  'TVRIP',\n  'TV-RIP',\n  'WEB',\n  'WEBCAST',\n  'WEBDL',\n  'WEB-DL',\n  'WEBRIP',\n  'WEB-RIP',\n  'WEB-MKV'\n]);\n\nconst Platfrom = new Set(['Baha', 'Bilibili', 'B-Global', 'ABEMA', 'CR', 'ViuTV', 'AMZN', 'ADN']);\n\nconst Type = new Set([\n  'GEKIJOUBAN',\n  'MOVIE',\n  'OAD',\n  'OAV',\n  'ONA',\n  'OVA',\n  'SPECIAL',\n  'SPECIALS',\n  'TV',\n  '特别篇',\n  '特別篇',\n  '特別編',\n  '特别话',\n  '特別话',\n  '特別話',\n  '番外篇',\n  '番外編',\n  '剧场版',\n  '劇場版',\n  //\n  'SP',\n  //\n  'ED',\n  'ENDING',\n  'NCED',\n  'NCOP',\n  'OP',\n  'OPENING',\n  'PREVIEW',\n  'PV'\n]);\n\nconst Languages = new Set([\n  'CN',\n  'CHS',\n  'CHT',\n  'YUE',\n  'JP',\n  '简体',\n  '国语中字',\n  '繁體',\n  '中日双语',\n  '简日双语',\n  '繁日雙語',\n  'HOY粵語'\n]);\n\nconst Subtitles = new Set([\n  'ASS',\n  'GB',\n  'BIG5',\n  'DUB',\n  'DUBBED',\n  'HARDSUB',\n  'HARDSUBS',\n  'RAW',\n  'SOFTSUB',\n  'SOFTSUBS',\n  'SUB',\n  'SUBBED',\n  'SUBTITLED',\n  'SRT'\n]);\n\nconst LanguagePrefixes = [\n  '简体',\n  '繁體',\n  '简日',\n  '繁日',\n  '简繁日双语',\n  '简繁日',\n  '简繁',\n  '繁简日',\n  '简繁日语',\n  '简日双语'\n];\n\nconst SubtitlesSufixes = new Set(['内嵌', '內嵌', '内封', '内封字幕', '外挂', '外掛']);\n\nconst PlatformLanguage = new Map([['ViuTV粵語', ['ViuTV', '粵語']]]);\n\nconst LanguageSubtitles = new Map([\n  ['简体字幕', ['简体', undefined]],\n  ['繁體字幕', ['繁體', undefined]],\n  ['简日双语字幕', ['简日双语', undefined]],\n  ['TVB粵語', ['粵語', undefined]],\n  ['代理商粵語', ['粵語', undefined]],\n  ['粵日雙語+內封繁體中文字幕', ['繁體中文', '內封字幕']],\n  ['粵語+無對白字幕', [undefined, '無對白字幕']]\n]);\n\nconst Extension = new Set([\n  '3GP',\n  'AVI',\n  'DIVX',\n  'FLV',\n  'M2TS',\n  'MKV',\n  'MOV',\n  'MP4',\n  'MPG',\n  'OGM',\n  'RM',\n  'RMVB',\n  'TS',\n  'WEBM',\n  'WMV'\n]);\n\nconst Tags = new Set(['国漫', '先行版', '先行版本', '正式版', '正式版本', 'Ani-One']);\n\n// Prefix\nconst SearchPrefix = ['检索：', '检索用：'];\nconst HiringPrefix = ['招募', '字幕社招人'];\nconst OtherPrefix = ['▶'];\n\nfunction matchSingleTag(ctx: Context, text: string) {\n  const upper = text.toUpperCase();\n  // Match keywords\n  if (AudioTerm.has(upper)) {\n    ctx.update3('file', 'audio', 'term', text);\n    return true;\n  }\n  if (VideoTerm.has(upper)) {\n    ctx.update3('file', 'video', 'term', text);\n    return true;\n  }\n  if (VideoResolution.has(upper)) {\n    ctx.update3('file', 'video', 'resolution', text);\n    return true;\n  }\n  if (Source.has(upper)) {\n    ctx.update('source', text);\n    return true;\n  }\n  if (Platfrom.has(text)) {\n    ctx.update('platform', text);\n    return true;\n  }\n  if (Type.has(upper)) {\n    ctx.update('type', text);\n    return true;\n  }\n  if (Extension.has(upper)) {\n    ctx.update2('file', 'extension', text);\n    return true;\n  }\n  if (Tags.has(text)) {\n    ctx.tags.push(text);\n    return true;\n  }\n\n  // Match language and subtitles\n  {\n    if (Languages.has(upper)) {\n      ctx.update('language', text);\n      return true;\n    }\n    if (Subtitles.has(upper)) {\n      ctx.update('subtitles', text);\n      return true;\n    }\n    // Combine language and subtitles\n    const combined = LanguageSubtitles.get(text);\n    if (combined) {\n      ctx.update('language', combined[0]);\n      ctx.update('subtitles', combined[1]);\n      return true;\n    }\n    const combined2 = PlatformLanguage.get(text);\n    if (combined2) {\n      ctx.update('platform', combined2[0]);\n      ctx.update('language', combined2[1]);\n      return true;\n    }\n\n    // Auto combined\n    for (const prefix of LanguagePrefixes) {\n      if (text.startsWith(prefix)) {\n        const language = prefix;\n        const subtitles = text.slice(prefix.length);\n        if (SubtitlesSufixes.has(subtitles)) {\n          ctx.update('language', language);\n          ctx.update('subtitles', subtitles);\n          return true;\n        }\n      }\n    }\n  }\n\n  // Match regex\n  {\n    {\n      // 2024年10月番\n      const match = /^(\\d\\d\\d\\d)年(\\d\\d?)月新?番$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const month = +match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // ★10月新番\n      const match = /^★?(\\d\\d?)月新?番★?$/.exec(text);\n      if (match) {\n        const month = +match[1];\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // [2024.12.15]\n      const match = /^(\\d\\d\\d\\d)\\.(\\d?\\d)\\.(\\d?\\d)$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const month = +match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        if (1 <= month && month <= 12) {\n          ctx.update('month', month);\n        }\n        return true;\n      }\n    }\n    {\n      // [2024SP]\n      const match = /^(\\d\\d\\d\\d)(SP)$/.exec(text);\n      if (match) {\n        const year = +match[1];\n        const type = match[2];\n        if (1949 <= year && year <= 2099) {\n          ctx.update('year', year);\n        }\n        ctx.update('type', type);\n        return true;\n      }\n    }\n    {\n      // v2\n      const match = /^[vV](\\d+)$/.exec(text);\n      if (match) {\n        const version = +match[1];\n        ctx.update('version', version);\n        return true;\n      }\n    }\n  }\n\n  // Match prefix\n  {\n    for (const prefix of SearchPrefix) {\n      if (text.startsWith(prefix)) {\n        const title = text.slice(prefix.length).trim();\n        ctx.tags.push(title);\n        return true;\n      }\n    }\n    for (const prefix of HiringPrefix) {\n      if (text.startsWith(prefix)) {\n        return true;\n      }\n    }\n    for (const prefix of OtherPrefix) {\n      if (text.startsWith(prefix)) {\n        ctx.tags.push(text);\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nconst TagSeperators = [' ', '_'];\nfunction matchMultipleTags(ctx: Context, text: string) {\n  for (const sep of TagSeperators) {\n    const parts = text.split(sep);\n    if (parts.length <= 1) continue;\n    let matched = true;\n    for (let i = 0; i < parts.length; i += 1) {\n      const part = parts[i];\n      if (!matchSingleTag(ctx, part)) {\n        matched = false;\n      }\n    }\n    if (matched) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction parseTag(ctx: Context, cursor: number) {\n  const token = ctx.tokens[cursor];\n  if (token.isWrapped) {\n    const text = token.text;\n    if (matchSingleTag(ctx, text)) {\n      return true;\n    }\n    if (matchEpiodes(ctx, text)) {\n      return true;\n    }\n    if (matchMultipleTags(ctx, text)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport function parseRightTags(ctx: Context) {\n  while (ctx.left < ctx.right) {\n    if (parseTag(ctx, ctx.right)) {\n      ctx.right -= 1;\n    } else {\n      // Unknown tags\n      if (ctx.left + 2 < ctx.right && ctx.right >= ctx.tokens.length - 1) {\n        ctx.tags.push(ctx.tokens[ctx.right].text);\n        ctx.right -= 1;\n      } else {\n        break;\n      }\n    }\n  }\n\n  {\n    // Handle space splitted tags: 【極影字幕社】★10月新番 在地下城尋求邂逅是否搞錯了什麼 第五季 豐饒的女神篇 第06話 BIG5 1080P MP4（字幕社招人內詳）\n    const token = ctx.tokens[ctx.right];\n    const text = token.text;\n    const sepearators = [' ', '★'];\n    for (const sep of sepearators) {\n      const parts = text.split(sep);\n      if (parts.length > 1) {\n        let changed = 0;\n        while (parts.length > 1) {\n          const part = parts[parts.length - 1];\n          // Skip single number\n          if (/^\\d+$/.test(part)) {\n            break;\n          }\n          if (\n            matchSingleTag(ctx, part) ||\n            matchEpiodes(ctx, part) ||\n            matchMultipleTags(ctx, part)\n          ) {\n            changed++;\n            parts.pop();\n          } else {\n            break;\n          }\n        }\n        if (changed > 1) {\n          const trimmed = parts.join(sep);\n          ctx.tokens[ctx.right] = new Token(trimmed, token.left, token.right);\n        }\n        if (changed > 0) {\n          break;\n        }\n      }\n    }\n  }\n}\n\nexport function parseLeftTags(ctx: Context) {\n  while (ctx.left < ctx.right) {\n    if (parseTag(ctx, ctx.left)) {\n      ctx.left += 1;\n    } else {\n      break;\n    }\n  }\n\n  // Match prefix\n  {\n    const token = ctx.tokens[ctx.left];\n    const text = token.text;\n    // 【极影字幕社】 ★10月新番\n    const match = /^★?(\\d\\d?)月新?番★?/.exec(text);\n    if (match) {\n      const matched = match[0];\n      const month = +match[1];\n      ctx.update('month', month);\n      ctx.tokens[ctx.left] = token.slice(matched.length);\n      if (ctx.tokens[ctx.left].text.length === 0) {\n        ctx.left += 1;\n      }\n    }\n  }\n  {\n    const token = ctx.tokens[ctx.left];\n    const text = token.text;\n    const match = /^★?(剧场版|劇場版)★?/.exec(text);\n    if (match) {\n      const matched = match[0];\n      const type = match[1];\n      ctx.update('type', type);\n      ctx.tokens[ctx.left] = token.slice(matched.length);\n      if (ctx.tokens[ctx.left].text.length === 0) {\n        ctx.left += 1;\n      }\n    }\n  }\n}\n\nexport function parseSuffixSeasonOrEpisodes(ctx: Context, text: string) {\n  while (true) {\n    let found = false;\n    // Ends with: [45]\n    if (RevWrappers.has(text[text.length - 1])) {\n      const leftWrapper = RevWrappers.get(text[text.length - 1])!;\n      const leftIdx = text.lastIndexOf(leftWrapper);\n      if (leftIdx !== -1) {\n        const maybe = text.slice(leftIdx + 1, text.length - 1);\n        if (maybe.length > 0) {\n          if (matchSingleTag(ctx, maybe) || (!ctx.hasEpisode && matchEpiodes(ctx, maybe))) {\n            text = text.slice(0, text.length - maybe.length - 2).trimEnd();\n            found = true;\n          }\n        }\n      }\n    }\n\n    //\n    for (const [re, fn] of SuffixSeasonOrEpisodesRes) {\n      const res = re.exec(text);\n      if (res && fn(res, ctx)) {\n        text = text.slice(0, text.length - res[0].length).trimEnd();\n        found = true;\n        break;\n      }\n    }\n    if (!found) break;\n  }\n\n  return text;\n}\n","import { Context } from './context';\nimport { parseSuffixEpisodes } from './episodes';\nimport { parseSuffixSeasonOrEpisodes } from './keyword';\n\nexport function parseFansub(ctx: Context) {\n  // [fansub] title\n  if (ctx.left + 1 > ctx.right) {\n    return false;\n  }\n\n  const token = ctx.tokens[ctx.left];\n  if (token.isWrapped) {\n    const text = token.text;\n\n    let found = false;\n    const seps = ['&', '·'];\n    for (const sep of seps) {\n      const [name, ...collab] = text.split(sep);\n\n      if (collab.length > 0) {\n        // Hack: [jibaketa合成&壓制]\n        if (collab.length === 1 && collab[0].endsWith('壓制')) {\n          break;\n        }\n\n        found = true;\n        ctx.update2('fansub', 'name', name);\n        ctx.update2('fansub', 'collab', collab);\n        break;\n      }\n    }\n\n    if (!found) {\n      ctx.update2('fansub', 'name', text);\n    }\n\n    ctx.left += 1;\n\n    return true;\n  }\n\n  return false;\n}\n\nexport function parseTitle(ctx: Context) {\n  // 1. Parse suffix episodes\n  parseSuffixEpisodes(ctx);\n\n  // 2. Parse titles\n  const rest = ctx.tokens.slice(ctx.left, ctx.right + 1);\n  if (rest.length === 0) return false;\n\n  // 2.1. Try split multiple titles\n  let found = false;\n\n  const matchParts = (parts: string[]) => {\n    const [title, ...other] = parts;\n\n    const trimmedTitle = parseSuffixSeasonOrEpisodes(ctx, title);\n    const trimmedOther = other\n      .map((t) => parseSuffixSeasonOrEpisodes(ctx, t))\n      .map((t) => t.trim())\n      .filter((t) => !!t && t !== trimmedTitle);\n\n    ctx.update('title', trimmedTitle);\n    if (trimmedOther.length > 0) {\n      ctx.update('titles', trimmedOther);\n    }\n  };\n\n  // [xxx][yyy]\n  if (rest.length > 1 && rest.every((t) => t.isWrapped)) {\n    matchParts(rest.map((t) => t.text));\n    found = true;\n  }\n\n  if (!found) {\n    const text = rest.length === 1 ? rest[0].text : rest.map((t) => t.toString()).join('');\n\n    const separators = ['/', '\\\\'];\n\n    for (const sep of separators) {\n      const parts = splitText(text, sep)\n        .map((t) => t.trim())\n        .filter((t) => !!t);\n      if (parts.length > 1) {\n        matchParts(parts);\n        found = true;\n        break;\n      }\n    }\n\n    // @hack ANi\n    if (!found && ctx.options.fansub === 'ANi') {\n      const parts = splitOnce(text, ' - ')\n        .map((t) => t.trim())\n        .filter((t) => !!t);\n      if (parts.length > 1) {\n        matchParts(parts);\n        found = true;\n      }\n    }\n\n    if (!found) {\n      const trimmed = parseSuffixSeasonOrEpisodes(ctx, text);\n      ctx.update('title', trimmed);\n    }\n  }\n\n  return true;\n}\n\nfunction splitText(text: string, sep: string) {\n  const parts = text.split(sep);\n  const ans = [];\n  for (let i = 0; i < parts.length; i++) {\n    if (i === 0) {\n      ans.push(parts[i]);\n    } else {\n      // 【喵萌奶茶屋】★10月新番★[乱马 1/2 2024年版 / Ranma ½ / Ranma 1/2 (2024)][10][1080p][简日双语][招募翻译]\n      if (sep === '/' && /\\d$/.test(parts[i - 1]) && /^\\d/.test(parts[i])) {\n        ans.pop();\n        ans.push(parts[i - 1] + '/' + parts[i]);\n      } else {\n        ans.push(parts[i]);\n      }\n    }\n  }\n  return ans;\n}\n\nfunction splitOnce(text: string, separator: string): [string, string] {\n  const found = text.indexOf(separator);\n  if (found === -1) {\n    return [text, ''];\n  }\n  const first = text.slice(0, found);\n  const second = text.slice(found + separator.length);\n  return [first, second];\n}\n","import type { ParseOptions, ParseResult } from './types';\n\nimport { Context } from './context';\nimport { tokenize } from './tokenizer';\nimport { parseLeftTags, parseRightTags } from './keyword';\nimport { parseFansub, parseTitle } from './title';\n\nexport function parse(title: string, options: ParseOptions = {}): ParseResult | undefined {\n  const tokens = tokenize(title);\n  if (tokens.length === 0) return undefined;\n\n  const context = new Context(tokens, options);\n\n  // 1. Parse right tags\n  parseRightTags(context);\n  // 2. Parse left tags\n  parseLeftTags(context);\n  // 3. Parse fansub\n  parseFansub(context);\n  parseLeftTags(context);\n  // 4. Parse title\n  if (!parseTitle(context)) {\n    return undefined;\n  }\n\n  // 6. Return result\n  const result = context.validate();\n  return result ? postprocess(result) : undefined;\n}\n\nfunction postprocess(result: ParseResult) {\n  if (result.fansub?.name === 'ANi') {\n    if (result.title && result.titles && result.titles.length === 1) {\n      const t1 = result.title;\n      const t2 = result.titles[0];\n      result.title = t2;\n      result.titles = [t1];\n    }\n  }\n  return result;\n}\n"],"names":[],"mappings":"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"}