{
  "version": 3,
  "sources": ["../src/constants.ts", "../src/rules.ts", "../src/Tokenizer.Kuromoji.ts", "../src/types.ts"],
  "sourcesContent": ["import type { BreakAfter, KuromojiPOSDetail1, StrengthOrder } from \"./types\";\n\nexport const PUNCTUATION_REGEX = /[\u3001\uFF64\u3002\uFF0C\uFF0E,.!?\uFF01\uFF1F]/;\nexport const NO_SEPARATOR_PUNCTUATION_REGEX = /[\u3001\uFF64,]/;\nexport const OPEN_PAREN_REGEX = /[[(\uFF08\u300C\u300E\u3010\u301D\u201C]/;\nexport const CLOSE_PAREN_REGEX = /[\\])\uFF09\u300D\u300F\u3011\u301F\u201D]/;\nexport const PAREN_ONLY_REGEX = /^[[\\]()\uFF08\uFF09\u300C\u300E\u3010\u301D\u201C\u300D\u300F\u3011\u301F\u201D]+$/;\nexport const SPACE_REGEX = /^\\s+$/;\nexport const KANJI_ONLY_REGEX = /^[\u4E00-\u9FAF]+$/;\n\nexport const STRENGTH_WEIGHT: StrengthOrder = {\n  none: 0,\n  weak: 1,\n  medium: 2,\n  strong: 3,\n};\n\nexport const DEFAULT_BREAK_AFTER: BreakAfter = Object.freeze({\n  hasSeparator: false,\n  hasNewLine: false,\n  hasWhitespace: false,\n  strength: \"none\",\n  reasons: [],\n  score: 0,\n});\n\nexport const CLAUSE_PARTICLES: Set<KuromojiPOSDetail1> = new Set([\n  \"\u683C\u52A9\u8A5E\",\n  \"\u7D42\u52A9\u8A5E\",\n  \"\u63A5\u7D9A\u52A9\u8A5E\",\n  \"\u4FC2\u52A9\u8A5E\",\n]);\n\nexport const ENGLISH_PRONOUN_BREAK_WORDS = new Set([\"i\", \"you\", \"we\", \"they\"]);\nexport const ENGLISH_PRONOUN_BREAK_BLOCKLIST = new Set([\n  \"with\",\n  \"to\",\n  \"for\",\n  \"of\",\n  \"in\",\n  \"on\",\n  \"at\",\n  \"from\",\n  \"by\",\n  \"as\",\n  \"into\",\n  \"onto\",\n  \"over\",\n  \"under\",\n  \"about\",\n  \"after\",\n  \"before\",\n  \"between\",\n  \"through\",\n  \"without\",\n  \"within\",\n  \"around\",\n  \"against\",\n  \"if\",\n  \"then\",\n  \"and\",\n  \"or\",\n  \"but\",\n  \"so\",\n  \"yet\",\n  \"nor\",\n  \"when\",\n  \"while\",\n  \"because\",\n  \"though\",\n  \"although\",\n  \"since\",\n  \"until\",\n  \"unless\",\n  \"where\",\n  \"once\",\n  \"that\",\n  \"than\",\n  \"am\",\n  \"is\",\n  \"are\",\n  \"was\",\n  \"were\",\n  \"be\",\n  \"been\",\n  \"being\",\n  \"do\",\n  \"does\",\n  \"did\",\n  \"have\",\n  \"has\",\n  \"had\",\n  \"can\",\n  \"could\",\n  \"will\",\n  \"would\",\n  \"shall\",\n  \"should\",\n  \"may\",\n  \"might\",\n  \"must\",\n]);\nexport const ENGLISH_LINE_BREAK_HINT_WORDS = new Set([\n  \"with\",\n  \"to\",\n  \"for\",\n  \"of\",\n  \"in\",\n  \"on\",\n  \"at\",\n  \"from\",\n  \"by\",\n  \"as\",\n  \"into\",\n  \"onto\",\n  \"over\",\n  \"under\",\n  \"about\",\n  \"after\",\n  \"before\",\n  \"between\",\n  \"through\",\n  \"without\",\n  \"within\",\n  \"around\",\n  \"against\",\n  \"if\",\n  \"then\",\n  \"and\",\n  \"or\",\n  \"but\",\n  \"so\",\n  \"yet\",\n  \"nor\",\n  \"when\",\n  \"while\",\n  \"because\",\n  \"though\",\n  \"although\",\n  \"since\",\n  \"until\",\n  \"unless\",\n  \"where\",\n  \"once\",\n  \"that\",\n  \"than\",\n  \"am\",\n  \"is\",\n  \"are\",\n  \"was\",\n  \"were\",\n  \"be\",\n  \"been\",\n  \"being\",\n  \"do\",\n  \"does\",\n  \"did\",\n  \"have\",\n  \"has\",\n  \"had\",\n  \"can\",\n  \"could\",\n  \"will\",\n  \"would\",\n  \"shall\",\n  \"should\",\n  \"may\",\n  \"might\",\n  \"must\",\n]);\nexport const ENGLISH_LINE_WORDS_MIN = 3;\nexport const ENGLISH_LINE_WORDS_TARGET = 5;\n\nexport const CLOSE_PAREN_SCORE = 5;\nexport const CLAUSE_SCORE = 3;\nexport const SCRIPT_CHANGE_SCORE = 2;\nexport const LENGTH_SCORE = 3;\nexport const PAREN_CONTENT_MIN_LENGTH = 12;\nexport const MIN_PHRASE_LENGTH_FOR_BREAK = 4;\n\nexport const SCRIPT_TYPE_PATTERNS = {\n  hiragana: /^[\\u3040-\\u309F]+$/,\n  katakana: /^[\\u30A0-\\u30FF]+$/,\n  kanji: /^[\\u4E00-\\u9FFF]+$/,\n  latin: /^[a-zA-Z]+$/,\n  number: /^[0-9]+$/,\n} as const;\n", "import {\n  CLOSE_PAREN_REGEX,\n  KANJI_ONLY_REGEX,\n  OPEN_PAREN_REGEX,\n} from \"./constants\";\nimport type { BreakStrength, KuromojiPOS, KuromojiPOSDetail1 } from \"./types\";\n\nexport type BoundaryRuleCondition = {\n  surface_form?: Array<RegExp | string>;\n  pos?: KuromojiPOS[];\n  pos_detail_1?: KuromojiPOSDetail1[];\n  conjugated_form?: string[];\n};\n\nexport type BoundaryScoreRule = {\n  name: string;\n  /** positive integer: higher means stronger break */\n  weight: number;\n  previous?: BoundaryRuleCondition;\n  current?: BoundaryRuleCondition;\n  next?: BoundaryRuleCondition;\n  nextNext?: BoundaryRuleCondition;\n};\n\nexport type BoundaryOverrideRule = {\n  name: string;\n  action: \"suppress\";\n  previous?: BoundaryRuleCondition;\n  current?: BoundaryRuleCondition;\n  next?: BoundaryRuleCondition;\n  nextNext?: BoundaryRuleCondition;\n};\n\nexport type BoundaryRestoreRule = {\n  name: string;\n  /** restore after a specific suppress reason */\n  whenSuppressedReason?: string[];\n  strength?: BreakStrength;\n  previous?: BoundaryRuleCondition;\n  current?: BoundaryRuleCondition;\n  next?: BoundaryRuleCondition;\n  nextNext?: BoundaryRuleCondition;\n  phraseHasPos?: KuromojiPOS[];\n};\n\nexport type LanguageTypeRule = {\n  name: \"english\" | \"japanese\" | \"mixed\" | \"other\";\n  when: (scriptTypes: Set<string>) => boolean;\n};\n\nexport const BOUNDARY_SCORE_RULES: BoundaryScoreRule[] = [\n  {\n    name: \"comma-break\",\n    weight: 5,\n    current: {\n      surface_form: [\"\u3001\", \"\uFF64\", \",\"],\n    },\n  },\n  {\n    name: \"ellipsis-break\",\n    weight: 5,\n    current: {\n      surface_form: [\"\u2026\"],\n    },\n  },\n  {\n    name: \"aux-boundary\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u975E\u81EA\u7ACB\"],\n    },\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u5F62\u5BB9\u52D5\u8A5E\u8A9E\u5E79\"],\n    },\n  },\n  {\n    name: \"repeat-pos-noun-verb\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\", \"\u52A9\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"repeat-pos-noun-noun\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\", \"\u52A9\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"repeat-verb-before-verb-aux\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"repeat-pos-rentai-verb\",\n    weight: 3,\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u9023\u4F53\u5316\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"particle-phrase-split\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u526F\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"particle-chain-to-adj\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u4FC2\u52A9\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u5F62\u5BB9\u8A5E\"],\n    },\n  },\n  {\n    name: \"rentai-noun-noun\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u9023\u4F53\u5316\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"rentai-after-adverb\",\n    weight: 3,\n    previous: {\n      pos: [\"\u526F\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u9023\u4F53\u5316\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"made-before-noun\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"object-particle-verb\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"aux-before-adverb\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u526F\u8A5E\"],\n    },\n  },\n  {\n    name: \"aux-ta-before-noun-object\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\", \"\u5F62\u5BB9\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n      surface_form: [\"\u305F\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u683C\u52A9\u8A5E\"],\n    },\n  },\n  {\n    name: \"aux-before-noun-compound\",\n    weight: 3,\n    previous: {\n      pos: [\"\u52D5\u8A5E\", \"\u5F62\u5BB9\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n      surface_form: [KANJI_ONLY_REGEX],\n    },\n    nextNext: {\n      pos: [\"\u540D\u8A5E\"],\n      surface_form: [KANJI_ONLY_REGEX],\n    },\n  },\n  {\n    name: \"parallel-particle-after-number\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u6570\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u4E26\u7ACB\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"aux-before-rentai\",\n    weight: 3,\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u9023\u4F53\u5316\"],\n    },\n  },\n  {\n    name: \"aux-after-noun\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"aux-nara-before-noun\",\n    weight: 3,\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n      conjugated_form: [\"\u4EEE\u5B9A\u5F62\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n  {\n    name: \"numeric-suffix-before-number\",\n    weight: 3,\n    current: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u63A5\u5C3E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u6570\"],\n    },\n  },\n  {\n    name: \"numeric-suffix-before-adverb\",\n    weight: 3,\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u6570\"],\n    },\n    current: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u63A5\u5C3E\"],\n    },\n    next: {\n      pos: [\"\u526F\u8A5E\"],\n    },\n  },\n  {\n    name: \"before-open-parenthesis\",\n    weight: 3,\n    current: {\n      pos: [\"\u540D\u8A5E\", \"\u52D5\u8A5E\", \"\u5F62\u5BB9\u8A5E\", \"\u526F\u8A5E\", \"\u63A5\u982D\u8A5E\"],\n    },\n    next: {\n      surface_form: [OPEN_PAREN_REGEX],\n    },\n  },\n];\n\nexport const BOUNDARY_OVERRIDE_RULES: BoundaryOverrideRule[] = [\n  {\n    name: \"particle-chain\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u683C\u52A9\u8A5E\", \"\u7D42\u52A9\u8A5E\", \"\u63A5\u7D9A\u52A9\u8A5E\", \"\u4FC2\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52A9\u8A5E\", \"\u52A9\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"object-particle-verb\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u683C\u52A9\u8A5E\"],\n      surface_form: [\"\u3068\", \"\u3092\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"rentai-before-particle\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u9023\u4F53\u5316\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52A9\u8A5E\"],\n    },\n  },\n  {\n    name: \"particle-before-adjective\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u4FC2\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u5F62\u5BB9\u8A5E\"],\n    },\n  },\n  {\n    name: \"adj-before-terminal\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u5F62\u5BB9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u7D42\u52A9\u8A5E\"],\n    },\n  },\n  {\n    name: \"quote-before-tte\",\n    action: \"suppress\",\n    current: {\n      surface_form: [CLOSE_PAREN_REGEX],\n    },\n    next: {\n      pos: [\"\u52A9\u8A5E\"],\n    },\n  },\n  {\n    name: \"te-iku-join\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u63A5\u7D9A\u52A9\u8A5E\"],\n      surface_form: [\"\u3066\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n      pos_detail_1: [\"\u975E\u81EA\u7ACB\"],\n    },\n  },\n  {\n    name: \"te-before-volitional\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u63A5\u7D9A\u52A9\u8A5E\"],\n      surface_form: [\"\u3066\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n      conjugated_form: [\"\u672A\u7136\u30A6\u63A5\u7D9A\"],\n    },\n  },\n  {\n    name: \"de-after-aux-before-verb\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u63A5\u7D9A\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"terminal-before-close-quote\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u7D42\u52A9\u8A5E\"],\n    },\n    next: {\n      surface_form: [CLOSE_PAREN_REGEX],\n    },\n  },\n  {\n    name: \"mo-before-verb\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u526F\u8A5E\u53EF\u80FD\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u4FC2\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"before-verb-pronoun\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u4EE3\u540D\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u4FC2\u52A9\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"ni-before-verb\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u683C\u52A9\u8A5E\", \"\u526F\u8A5E\u5316\"],\n      surface_form: [\"\u306B\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"adj-yo-na\",\n    action: \"suppress\",\n    current: {\n      pos: [\"\u5F62\u5BB9\u8A5E\"],\n    },\n    nextNext: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n  },\n  {\n    name: \"kanji-compound-after\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    current: {\n      pos: [\"\u540D\u8A5E\"],\n      surface_form: [KANJI_ONLY_REGEX],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n      surface_form: [KANJI_ONLY_REGEX],\n    },\n  },\n  {\n    name: \"adjectival-noun\",\n    action: \"suppress\",\n    previous: {\n      pos: [\"\u540D\u8A5E\"],\n      pos_detail_1: [\"\u5F62\u5BB9\u52D5\u8A5E\u8A9E\u5E79\"],\n    },\n    current: {\n      pos: [\"\u52A9\u52D5\u8A5E\"],\n    },\n    next: {\n      pos: [\"\u540D\u8A5E\"],\n    },\n  },\n];\n\nexport const BOUNDARY_RESTORE_RULES: BoundaryRestoreRule[] = [\n  {\n    name: \"object-particle-verb-restore\",\n    whenSuppressedReason: [\"object-particle-verb\"],\n    strength: \"medium\",\n    current: {\n      pos: [\"\u52A9\u8A5E\"],\n      pos_detail_1: [\"\u683C\u52A9\u8A5E\"],\n      surface_form: [\"\u3092\", \"\u3068\"],\n    },\n    next: {\n      pos: [\"\u52D5\u8A5E\"],\n    },\n    phraseHasPos: [\"\u52D5\u8A5E\", \"\u5F62\u5BB9\u8A5E\", \"\u52A9\u52D5\u8A5E\"],\n  },\n];\n\nexport const LANGUAGE_TYPE_RULES: LanguageTypeRule[] = [\n  {\n    name: \"english\",\n    when: (scriptTypes) => scriptTypes.size === 1 && scriptTypes.has(\"latin\"),\n  },\n  {\n    name: \"japanese\",\n    when: (scriptTypes) =>\n      scriptTypes.size === 1 &&\n      (scriptTypes.has(\"hiragana\") ||\n        scriptTypes.has(\"katakana\") ||\n        scriptTypes.has(\"kanji\")),\n  },\n  {\n    name: \"mixed\",\n    when: (scriptTypes) => scriptTypes.size > 1 && scriptTypes.has(\"latin\"),\n  },\n  {\n    name: \"other\",\n    when: () => true,\n  },\n];\n", "import type { CreateLineArgs, WordTimeline } from \"@ioris/core\";\nimport type { IpadicFeatures, Tokenizer } from \"kuromoji\";\nimport {\n  CLAUSE_PARTICLES,\n  CLAUSE_SCORE,\n  CLOSE_PAREN_REGEX,\n  CLOSE_PAREN_SCORE,\n  DEFAULT_BREAK_AFTER,\n  ENGLISH_LINE_BREAK_HINT_WORDS,\n  ENGLISH_LINE_WORDS_MIN,\n  ENGLISH_LINE_WORDS_TARGET,\n  ENGLISH_PRONOUN_BREAK_BLOCKLIST,\n  ENGLISH_PRONOUN_BREAK_WORDS,\n  LENGTH_SCORE,\n  MIN_PHRASE_LENGTH_FOR_BREAK,\n  NO_SEPARATOR_PUNCTUATION_REGEX,\n  OPEN_PAREN_REGEX,\n  PAREN_CONTENT_MIN_LENGTH,\n  PAREN_ONLY_REGEX,\n  PUNCTUATION_REGEX,\n  SCRIPT_CHANGE_SCORE,\n  SCRIPT_TYPE_PATTERNS,\n  SPACE_REGEX,\n  STRENGTH_WEIGHT,\n} from \"./constants\";\nimport {\n  BOUNDARY_OVERRIDE_RULES,\n  BOUNDARY_RESTORE_RULES,\n  BOUNDARY_SCORE_RULES,\n  type BoundaryRuleCondition,\n  LANGUAGE_TYPE_RULES,\n} from \"./rules\";\nimport type {\n  BreakAfter,\n  BreakReason,\n  BreakStrength,\n  KuromojiPOS,\n  KuromojiPOSDetail1,\n  LineArgsTokenizerResult,\n  Phrase,\n  ScriptType,\n  TokenWithBreak,\n} from \"./types\";\n\nfunction detectScriptType(text: string): ScriptType {\n  if (SCRIPT_TYPE_PATTERNS.hiragana.test(text)) return \"hiragana\";\n  if (SCRIPT_TYPE_PATTERNS.katakana.test(text)) return \"katakana\";\n  if (SCRIPT_TYPE_PATTERNS.kanji.test(text)) return \"kanji\";\n  if (SCRIPT_TYPE_PATTERNS.latin.test(text)) return \"latin\";\n  if (SCRIPT_TYPE_PATTERNS.number.test(text)) return \"number\";\n  if (PUNCTUATION_REGEX.test(text) || OPEN_PAREN_REGEX.test(text)) {\n    return \"symbol\";\n  }\n  return \"other\";\n}\n\nfunction mapScoreToStrength(score: number): BreakStrength {\n  if (score >= 8) return \"strong\";\n  if (score >= 3) return \"medium\";\n  if (score > 0) return \"weak\";\n  return \"none\";\n}\n\nfunction matchesRuleCondition(\n  token: TokenWithBreak | undefined,\n  condition: BoundaryRuleCondition | undefined,\n): boolean {\n  if (!condition) return true;\n  if (!token) return false;\n\n  // Enhanced early evaluation: evaluate conditions most likely to fail first\n  // 1. pos (part of speech) - highest selectivity\n  if (condition.pos && !condition.pos.includes(token.pos)) {\n    return false;\n  }\n\n  // 2. pos_detail_1 (part of speech subcategory 1) - next highest selectivity\n  if (\n    condition.pos_detail_1 &&\n    !condition.pos_detail_1.includes(token.pos_detail_1)\n  ) {\n    return false;\n  }\n\n  // 3. conjugated_form - effective only for verbs and adjectives\n  if (\n    condition.conjugated_form &&\n    !condition.conjugated_form.includes(token.conjugated_form)\n  ) {\n    return false;\n  }\n\n  // 4. surface_form (surface form) - evaluate regular expressions last\n  if (condition.surface_form) {\n    const matches = condition.surface_form.some((pattern) => {\n      if (typeof pattern === \"string\") {\n        return token.surface_form === pattern;\n      }\n      return pattern.test(token.surface_form);\n    });\n    if (!matches) return false;\n  }\n\n  return true;\n}\n\nfunction isLatinLike(text: string): boolean {\n  return /[A-Za-z0-9]/.test(text);\n}\n\nfunction isEnglishConnectorToken(token: TokenWithBreak): boolean {\n  return token.surface_form === \"'\" || token.surface_form === \"\u2019\";\n}\n\nfunction collectEnglishWordSegments(tokens: TokenWithBreak[]): number[][] {\n  const segments: number[][] = [];\n  let current: number[] = [];\n\n  for (const token of tokens) {\n    if (token.isWhitespaceToken) {\n      continue;\n    }\n\n    const isWord = isLatinLike(token.surface_form);\n    if (isWord) {\n      current.push(token.index);\n    } else if (!isEnglishConnectorToken(token)) {\n      if (current.length > 0) {\n        segments.push(current);\n        current = [];\n      }\n    }\n\n    if (token.breakAfter?.hasNewLine && current.length > 0) {\n      segments.push(current);\n      current = [];\n    }\n  }\n\n  if (current.length > 0) {\n    segments.push(current);\n  }\n\n  return segments;\n}\n\nfunction isEnglishBoundary(\n  prevToken: TokenWithBreak | undefined,\n  nextToken: TokenWithBreak | undefined,\n): boolean {\n  return (\n    !!prevToken &&\n    !!nextToken &&\n    isLatinLike(prevToken.surface_form) &&\n    isLatinLike(nextToken.surface_form)\n  );\n}\n\nfunction shouldForceEnglishPronounBreak(\n  prevToken: TokenWithBreak | undefined,\n  nextToken: TokenWithBreak | undefined,\n): boolean {\n  if (!prevToken || !nextToken) return false;\n  if (!isEnglishBoundary(prevToken, nextToken)) return false;\n  const nextWord = nextToken.surface_form.toLowerCase();\n  if (!ENGLISH_PRONOUN_BREAK_WORDS.has(nextWord)) return false;\n  return !ENGLISH_PRONOUN_BREAK_BLOCKLIST.has(\n    prevToken.surface_form.toLowerCase(),\n  );\n}\n\nfunction applyEnglishWordBreaks(tokens: TokenWithBreak[]): void {\n  const segments = collectEnglishWordSegments(tokens);\n\n  for (const segment of segments) {\n    let cursor = 0;\n    while (cursor < segment.length) {\n      const remaining = segment.length - cursor;\n      if (remaining <= ENGLISH_LINE_WORDS_TARGET) {\n        break;\n      }\n\n      let breakAt = -1;\n      for (\n        let size = ENGLISH_LINE_WORDS_MIN;\n        size <= ENGLISH_LINE_WORDS_TARGET;\n        size++\n      ) {\n        const nextIndex = cursor + size;\n        if (nextIndex >= segment.length) {\n          break;\n        }\n        const nextWord = tokens[segment[nextIndex]].surface_form.toLowerCase();\n        if (ENGLISH_LINE_BREAK_HINT_WORDS.has(nextWord)) {\n          breakAt = size;\n          break;\n        }\n      }\n\n      if (breakAt === -1) {\n        breakAt = ENGLISH_LINE_WORDS_TARGET;\n        if (remaining - breakAt === 1) {\n          breakAt = ENGLISH_LINE_WORDS_MIN;\n        }\n      } else if (remaining - breakAt === 1) {\n        breakAt = ENGLISH_LINE_WORDS_MIN;\n      }\n\n      const breakTokenIndex = segment[cursor + breakAt - 1];\n      const breakToken = tokens[breakTokenIndex];\n      if (!breakToken.breakAfter?.hasNewLine) {\n        breakToken.breakAfter = mergeBreakAfter(\n          breakToken.breakAfter,\n          createBreakAfter({\n            strength: \"medium\",\n            hasNewLine: true,\n            reasons: [{ type: \"english-word-limit\" }],\n          }),\n        );\n      }\n\n      cursor += breakAt;\n    }\n  }\n}\n\nfunction isJapaneseScriptType(scriptType: ScriptType): boolean {\n  return (\n    scriptType === \"hiragana\" ||\n    scriptType === \"katakana\" ||\n    scriptType === \"kanji\"\n  );\n}\n\nfunction createBreakAfter(props: {\n  score?: number;\n  strength?: BreakStrength;\n  hasWhitespace?: boolean;\n  hasNewLine?: boolean;\n  hasSeparator?: boolean;\n  reasons?: BreakReason[];\n}): BreakAfter {\n  const strength = props.strength ?? mapScoreToStrength(props.score ?? 0);\n  return {\n    hasSeparator: props.hasSeparator ?? false,\n    hasNewLine: props.hasNewLine ?? false,\n    hasWhitespace: props.hasWhitespace ?? false,\n    strength,\n    reasons: props.reasons ?? [],\n    score: props.score ?? 0,\n  };\n}\n\nfunction mergeBreakAfter(\n  current: BreakAfter | undefined,\n  next: BreakAfter,\n): BreakAfter {\n  if (!current) return next;\n  const stronger =\n    STRENGTH_WEIGHT[next.strength] > STRENGTH_WEIGHT[current.strength]\n      ? next.strength\n      : current.strength;\n\n  return {\n    hasSeparator: current.hasSeparator || next.hasSeparator,\n    hasNewLine: current.hasNewLine || next.hasNewLine,\n    hasWhitespace: current.hasWhitespace || next.hasWhitespace,\n    strength: stronger,\n    reasons: [...current.reasons, ...next.reasons],\n    score: Math.max(current.score, next.score),\n  };\n}\n\nfunction updateBreakAfter(\n  current: BreakAfter,\n  updates: Partial<\n    Pick<\n      BreakAfter,\n      \"strength\" | \"hasWhitespace\" | \"hasNewLine\" | \"hasSeparator\"\n    >\n  >,\n  newReason?: BreakReason,\n): BreakAfter {\n  return {\n    hasSeparator: updates.hasSeparator ?? current.hasSeparator,\n    hasNewLine: updates.hasNewLine ?? current.hasNewLine,\n    hasWhitespace: updates.hasWhitespace ?? current.hasWhitespace,\n    strength: updates.strength ?? current.strength,\n    reasons: newReason ? [...current.reasons, newReason] : current.reasons,\n    score: current.score,\n  };\n}\n\nfunction findAdjacentVisibleTokens(\n  tokens: TokenWithBreak[],\n  index: number,\n): {\n  prevToken?: TokenWithBreak;\n  nextToken?: TokenWithBreak;\n  nextNextToken?: TokenWithBreak;\n} {\n  let nextToken: TokenWithBreak | undefined;\n  let nextNextToken: TokenWithBreak | undefined;\n  let visibleCount = 0;\n\n  for (let i = index + 1; i < tokens.length; i++) {\n    if (!tokens[i].isWhitespaceToken) {\n      if (visibleCount === 0) {\n        nextToken = tokens[i];\n      } else if (visibleCount === 1) {\n        nextNextToken = tokens[i];\n        break;\n      }\n      visibleCount++;\n    }\n  }\n\n  let prevToken: TokenWithBreak | undefined;\n  for (let i = index - 1; i >= 0; i--) {\n    if (!tokens[i].isWhitespaceToken) {\n      prevToken = tokens[i];\n      break;\n    }\n  }\n\n  return { prevToken, nextToken, nextNextToken };\n}\n\nfunction hasExplicitBoundaryReason(breakAfter: BreakAfter): boolean {\n  return breakAfter.reasons.some(\n    (reason) =>\n      reason.type === \"explicit-newline\" || reason.type === \"explicit-space\",\n  );\n}\n\nfunction canSuppressBreak(breakAfter: BreakAfter): boolean {\n  if (hasExplicitBoundaryReason(breakAfter)) return false;\n  return breakAfter.reasons.some((reason) => reason.type === \"clause-boundary\");\n}\n\nfunction suppressShortPhrases(tokens: TokenWithBreak[]): void {\n  const visibleTokens = tokens.filter((token) => !token.isWhitespaceToken);\n  if (visibleTokens.length === 0) return;\n\n  let phraseStart = 0;\n  let currentLength = 0;\n\n  for (let index = 0; index < visibleTokens.length; index++) {\n    const token = visibleTokens[index];\n    currentLength += token.surface_form.length;\n\n    const strength = token.breakAfter?.strength ?? \"none\";\n    if (strength === \"none\") continue;\n\n    if (\n      currentLength < MIN_PHRASE_LENGTH_FOR_BREAK &&\n      index < visibleTokens.length - 1\n    ) {\n      const currentBreak = token.breakAfter;\n      const prevToken = phraseStart > 0 ? visibleTokens[phraseStart - 1] : null;\n      if (\n        currentBreak &&\n        currentBreak.strength !== \"strong\" &&\n        canSuppressBreak(currentBreak) &&\n        prevToken &&\n        isPunctuation(prevToken)\n      ) {\n        token.breakAfter = updateBreakAfter(\n          currentBreak,\n          {\n            strength: \"none\",\n            hasWhitespace: false,\n            hasNewLine: false,\n            hasSeparator: false,\n          },\n          { type: \"short-phrase-guard\" },\n        );\n      }\n    }\n\n    phraseStart = index + 1;\n    currentLength = 0;\n  }\n}\n\nfunction isPunctuation(token: TokenWithBreak): boolean {\n  return PUNCTUATION_REGEX.test(token.surface_form);\n}\n\nfunction isCloseParenthesis(token: TokenWithBreak): boolean {\n  return CLOSE_PAREN_REGEX.test(token.surface_form);\n}\n\nfunction isOpenParenthesis(token: TokenWithBreak): boolean {\n  return OPEN_PAREN_REGEX.test(token.surface_form);\n}\n\nfunction isClauseBoundary(token: TokenWithBreak): boolean {\n  return (\n    token.pos === \"\u52A9\u8A5E\" &&\n    typeof token.pos_detail_1 === \"string\" &&\n    CLAUSE_PARTICLES.has(token.pos_detail_1)\n  );\n}\n\nfunction scriptChanged(\n  current: TokenWithBreak,\n  next: TokenWithBreak | undefined,\n): boolean {\n  if (!next) return false;\n  return current.scriptType !== next.scriptType;\n}\n\nfunction exceedsLength(token: TokenWithBreak): boolean {\n  const threshold = token.scriptType === \"latin\" ? 10 : 8;\n  return token.surface_form.length >= threshold;\n}\n\nfunction parseWithKuromoji(\n  timeline: WordTimeline,\n  tokenizer: Tokenizer<IpadicFeatures>,\n): TokenWithBreak[] {\n  const rawTokens = tokenizer.tokenize(timeline.text);\n  const tokens = rawTokens.flatMap((token) => {\n    if (\n      PAREN_ONLY_REGEX.test(token.surface_form) &&\n      token.surface_form.length > 1\n    ) {\n      return Array.from(token.surface_form).map((char) => ({\n        ...token,\n        surface_form: char,\n      }));\n    }\n    return token;\n  });\n  const cleanedLength =\n    timeline.text.replaceAll(/\\s+/g, \"\").length || timeline.text.length || 1;\n  const durationByChar = (timeline.end - timeline.begin) / cleanedLength;\n\n  let cursor = timeline.begin;\n\n  return tokens.map((token, index) => {\n    const duration = Number.parseFloat(\n      (durationByChar * token.surface_form.length).toFixed(3),\n    );\n    const begin = Number.parseFloat(cursor.toFixed(3));\n    const end = Number.parseFloat((begin + duration).toFixed(3));\n    cursor = end;\n\n    return {\n      ...token,\n      pos: token.pos as KuromojiPOS,\n      pos_detail_1: token.pos_detail_1 as KuromojiPOSDetail1,\n      index,\n      begin,\n      end,\n      isWhitespaceToken: SPACE_REGEX.test(token.surface_form),\n      scriptType: detectScriptType(token.surface_form),\n    };\n  });\n}\n\n/**\n * Integrated helper function for whitespace processing.\n * Detects newlines and spaces in text and generates a BreakAfter object.\n */\nfunction detectWhitespaceBreak(\n  text: string,\n  prevToken: TokenWithBreak,\n  nextToken: TokenWithBreak | undefined,\n): BreakAfter | null {\n  const hasWhitespace = /\\s/.test(text);\n  if (!hasWhitespace) return null;\n\n  const forceEnglishPronounBreak = shouldForceEnglishPronounBreak(\n    prevToken,\n    nextToken,\n  );\n  const hasNewLine =\n    text.includes(\"\\n\") ||\n    (text.includes(\" \") &&\n      (!isEnglishBoundary(prevToken, nextToken) || forceEnglishPronounBreak));\n\n  return createBreakAfter({\n    strength: hasNewLine ? \"strong\" : \"medium\",\n    hasWhitespace: !hasNewLine,\n    hasNewLine,\n    reasons: [\n      {\n        type: hasNewLine\n          ? forceEnglishPronounBreak\n            ? \"english-pronoun-break\"\n            : \"explicit-newline\"\n          : \"explicit-space\",\n      },\n    ],\n  });\n}\n\nfunction applyExplicitWhitespace(\n  tokens: TokenWithBreak[],\n  text: string,\n): TokenWithBreak[] {\n  let cursor = 0;\n  let lastVisibleIndex = -1;\n\n  for (const token of tokens) {\n    const nextIndex = text.indexOf(token.surface_form, cursor);\n    if (nextIndex > cursor && lastVisibleIndex >= 0) {\n      const between = text.slice(cursor, nextIndex);\n      const prevToken = tokens[lastVisibleIndex];\n      const explicitBreak = detectWhitespaceBreak(\n        between,\n        prevToken,\n        token.isWhitespaceToken ? undefined : token,\n      );\n\n      if (explicitBreak) {\n        const lastToken = tokens[lastVisibleIndex];\n        lastToken.breakAfter = mergeBreakAfter(\n          lastToken.breakAfter,\n          explicitBreak,\n        );\n      }\n    }\n\n    cursor = nextIndex + token.surface_form.length;\n    if (!token.isWhitespaceToken) {\n      lastVisibleIndex = token.index;\n    }\n  }\n\n  const remaining = text.slice(cursor);\n  if (\n    remaining.trim() === \"\" &&\n    remaining.length > 0 &&\n    lastVisibleIndex >= 0\n  ) {\n    const prevToken = tokens[lastVisibleIndex];\n    const explicitBreak = detectWhitespaceBreak(\n      remaining,\n      prevToken,\n      undefined,\n    );\n\n    if (explicitBreak) {\n      const lastToken = tokens[lastVisibleIndex];\n      lastToken.breakAfter = mergeBreakAfter(\n        lastToken.breakAfter,\n        explicitBreak,\n      );\n    }\n  }\n\n  if (remaining.length > 0 && remaining.trim() !== \"\") {\n    // Non-whitespace trailing content was not tokenized; surface this for debugging.\n    // This does not change tokenization behavior, but makes potential issues visible.\n    // eslint-disable-next-line no-console\n    console.warn(\n      \"[Tokenizer.Kuromoji] Unparsed trailing text after last token:\",\n      JSON.stringify(remaining),\n    );\n  }\n\n  return tokens;\n}\n\nfunction generateBreaksOnTokens(\n  parsedTokens: TokenWithBreak[],\n  text: string,\n): TokenWithBreak[] {\n  const tokens = applyExplicitWhitespace(parsedTokens, text);\n\n  // \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D9\u30FC\u30B9\u306E\u6700\u9069\u5316: \u53EF\u8996\u30C8\u30FC\u30AF\u30F3\u306E\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u4E8B\u524D\u8A08\u7B97\n  const visibleIndices: number[] = [];\n  for (let i = 0; i < tokens.length; i++) {\n    if (!tokens[i].isWhitespaceToken) {\n      visibleIndices.push(i);\n    }\n  }\n\n  let lastVisibleIndex = -1;\n  for (let index = 0; index < tokens.length; index++) {\n    const token = tokens[index];\n    if (token.isWhitespaceToken) {\n      if (lastVisibleIndex >= 0) {\n        const prevToken = tokens[lastVisibleIndex];\n        const nextVisible = tokens\n          .slice(index + 1)\n          .find((candidate) => !candidate.isWhitespaceToken);\n        const explicitBreak = detectWhitespaceBreak(\n          token.surface_form,\n          prevToken,\n          nextVisible,\n        );\n\n        if (explicitBreak) {\n          const lastToken = tokens[lastVisibleIndex];\n          lastToken.breakAfter = mergeBreakAfter(\n            lastToken.breakAfter,\n            explicitBreak,\n          );\n        }\n      }\n      continue;\n    }\n    lastVisibleIndex = token.index;\n  }\n\n  for (let index = 0; index < tokens.length; index++) {\n    const token = tokens[index];\n    if (token.isWhitespaceToken) continue;\n\n    const { prevToken, nextToken, nextNextToken } = findAdjacentVisibleTokens(\n      tokens,\n      index,\n    );\n\n    let score = 0;\n    const reasons: BreakReason[] = [];\n\n    if (isClauseBoundary(token)) {\n      score += CLAUSE_SCORE;\n      reasons.push({ type: \"clause-boundary\" });\n    }\n\n    if (isCloseParenthesis(token)) {\n      score += CLOSE_PAREN_SCORE;\n      reasons.push({ type: \"close-parenthesis\" });\n    }\n\n    if (scriptChanged(token, nextToken)) {\n      score += SCRIPT_CHANGE_SCORE;\n      reasons.push({ type: \"script-change\" });\n    }\n\n    if (exceedsLength(token)) {\n      score += LENGTH_SCORE;\n      reasons.push({ type: \"length\" });\n    }\n\n    for (const rule of BOUNDARY_SCORE_RULES) {\n      if (\n        matchesRuleCondition(prevToken, rule.previous) &&\n        matchesRuleCondition(token, rule.current) &&\n        matchesRuleCondition(nextToken, rule.next) &&\n        matchesRuleCondition(nextNextToken, rule.nextNext)\n      ) {\n        score += rule.weight;\n        reasons.push({ type: rule.name });\n      }\n    }\n\n    const strength = mapScoreToStrength(score);\n    const shouldBreakLine = strength === \"medium\" || strength === \"strong\";\n    const hasSeparator =\n      isPunctuation(token) &&\n      !NO_SEPARATOR_PUNCTUATION_REGEX.test(token.surface_form) &&\n      ((prevToken && isJapaneseScriptType(prevToken.scriptType)) ||\n        (nextToken && isJapaneseScriptType(nextToken.scriptType)));\n    const breakAfter = createBreakAfter({\n      score,\n      strength,\n      hasSeparator,\n      hasWhitespace: false,\n      hasNewLine: shouldBreakLine,\n      reasons,\n    });\n\n    token.breakAfter = mergeBreakAfter(token.breakAfter, breakAfter);\n  }\n\n  applyEnglishWordBreaks(tokens);\n\n  let depth = 0;\n  let innerLength = 0;\n  for (const token of tokens) {\n    if (token.isWhitespaceToken) {\n      continue;\n    }\n\n    if (isOpenParenthesis(token)) {\n      depth += 1;\n      innerLength = 0;\n    }\n\n    if (depth > 0 && !isCloseParenthesis(token)) {\n      innerLength += token.surface_form.length;\n      if (token.breakAfter && token.breakAfter.strength !== \"strong\") {\n        if (innerLength < PAREN_CONTENT_MIN_LENGTH) {\n          token.breakAfter = updateBreakAfter(\n            token.breakAfter,\n            {\n              hasNewLine: false,\n              hasWhitespace: false,\n              strength: \"none\",\n            },\n            { type: \"parenthesis-guard\" },\n          );\n        }\n      }\n      if (token.breakAfter && innerLength < PAREN_CONTENT_MIN_LENGTH) {\n        const hasExplicitSpace = token.breakAfter.reasons.some(\n          (reason) => reason.type === \"explicit-space\",\n        );\n        const hasExplicitNewline = token.breakAfter.reasons.some(\n          (reason) => reason.type === \"explicit-newline\",\n        );\n        if (hasExplicitSpace && !hasExplicitNewline) {\n          token.breakAfter = updateBreakAfter(\n            token.breakAfter,\n            {\n              hasNewLine: false,\n              hasWhitespace: true,\n              strength: \"none\",\n            },\n            { type: \"parenthesis-space-guard\" },\n          );\n        }\n      }\n    }\n\n    if (isCloseParenthesis(token) && depth > 0) {\n      depth -= 1;\n      innerLength = 0;\n    }\n  }\n\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.isWhitespaceToken) continue;\n\n    const {\n      prevToken: prev,\n      nextToken: nextVisible,\n      nextNextToken,\n    } = findAdjacentVisibleTokens(tokens, i);\n\n    if (nextVisible && isPunctuation(nextVisible) && token.breakAfter) {\n      token.breakAfter = updateBreakAfter(\n        token.breakAfter,\n        {\n          strength: \"none\",\n          hasWhitespace: false,\n          hasNewLine: false,\n        },\n        { type: \"before-punctuation\" },\n      );\n    }\n    if (token.breakAfter) {\n      for (const rule of BOUNDARY_OVERRIDE_RULES) {\n        if (\n          matchesRuleCondition(prev, rule.previous) &&\n          matchesRuleCondition(token, rule.current) &&\n          matchesRuleCondition(nextVisible, rule.next) &&\n          matchesRuleCondition(nextNextToken, rule.nextNext)\n        ) {\n          token.breakAfter = updateBreakAfter(\n            token.breakAfter,\n            {\n              strength: \"none\",\n              hasWhitespace: false,\n              hasNewLine: false,\n            },\n            { type: rule.name },\n          );\n        }\n      }\n    }\n  }\n\n  // \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u30D9\u30FC\u30B9\u306E\u6700\u9069\u5316: visibleIndices\u3092\u6D3B\u7528\n  let phraseStart = 0;\n  for (let visIdx = 0; visIdx < visibleIndices.length; visIdx++) {\n    const i = visibleIndices[visIdx];\n    const token = tokens[i];\n    const breakAfter = token.breakAfter;\n    const strength = breakAfter?.strength ?? \"none\";\n\n    const nextVisible =\n      visIdx + 1 < visibleIndices.length\n        ? tokens[visibleIndices[visIdx + 1]]\n        : undefined;\n    const nextNextVisible =\n      visIdx + 2 < visibleIndices.length\n        ? tokens[visibleIndices[visIdx + 2]]\n        : undefined;\n    const prevVisible =\n      visIdx > 0 ? tokens[visibleIndices[visIdx - 1]] : undefined;\n\n    if (breakAfter && strength === \"none\") {\n      for (const rule of BOUNDARY_RESTORE_RULES) {\n        if (\n          rule.whenSuppressedReason &&\n          !breakAfter.reasons.some((reason) =>\n            rule.whenSuppressedReason?.includes(reason.type),\n          )\n        ) {\n          continue;\n        }\n        if (\n          !matchesRuleCondition(prevVisible, rule.previous) ||\n          !matchesRuleCondition(token, rule.current) ||\n          !matchesRuleCondition(nextVisible, rule.next) ||\n          !matchesRuleCondition(nextNextVisible, rule.nextNext)\n        ) {\n          continue;\n        }\n        if (rule.phraseHasPos) {\n          const phraseTokenIndices = visibleIndices.slice(\n            phraseStart,\n            visIdx + 1,\n          );\n          const hasPos = phraseTokenIndices.some((phraseIdx) =>\n            rule.phraseHasPos?.includes(tokens[phraseIdx].pos),\n          );\n          if (!hasPos) {\n            continue;\n          }\n        }\n\n        token.breakAfter = mergeBreakAfter(\n          breakAfter,\n          createBreakAfter({\n            strength: rule.strength ?? \"medium\",\n            hasNewLine: true,\n            reasons: [{ type: rule.name }],\n          }),\n        );\n        break;\n      }\n    }\n\n    if (token.breakAfter?.strength !== \"none\") {\n      phraseStart = visIdx + 1;\n    }\n  }\n\n  for (let i = 1; i < tokens.length; i++) {\n    const prev = tokens[i - 1];\n    const current = tokens[i];\n    if (prev.isWhitespaceToken || current.isWhitespaceToken) continue;\n    if (isPunctuation(prev) && isPunctuation(current) && prev.breakAfter) {\n      prev.breakAfter = updateBreakAfter(\n        prev.breakAfter,\n        {\n          strength: \"none\",\n          hasWhitespace: false,\n          hasNewLine: false,\n        },\n        { type: \"punctuation-join\" },\n      );\n    }\n  }\n\n  suppressShortPhrases(tokens);\n\n  return tokens;\n}\n\nfunction segmentByBreakAfter(tokens: TokenWithBreak[]): Phrase[] {\n  const phrases: Phrase[] = [];\n  let current: TokenWithBreak[] = [];\n\n  const visibleTokens = tokens.filter((token) => !token.isWhitespaceToken);\n\n  for (const token of visibleTokens) {\n    current.push(token);\n    const strength = token.breakAfter?.strength ?? \"none\";\n    if (strength !== \"none\") {\n      phrases.push(buildPhrase(current));\n      current = [];\n    }\n  }\n\n  if (current.length > 0) {\n    phrases.push(buildPhrase(current));\n  }\n\n  return phrases;\n}\n\nfunction buildPhrase(tokens: TokenWithBreak[]): Phrase {\n  const last = tokens[tokens.length - 1];\n  const fullText = tokens.map((t) => t.surface_form).join(\"\");\n\n  const scriptTypes = new Set(tokens.map((token) => token.scriptType));\n  const languageType =\n    LANGUAGE_TYPE_RULES.find((rule) => rule.when(scriptTypes))?.name ?? \"other\";\n\n  return {\n    phraseID: crypto.randomUUID(),\n    tokens,\n    fullText,\n    features: {\n      languageType,\n      isParenthetical:\n        tokens.some((t) => isOpenParenthesis(t)) &&\n        tokens.some((t) => isCloseParenthesis(t)),\n      isRepetition: new Set(tokens.map((t) => t.surface_form)).size === 1,\n    },\n    breakInfo: last.breakAfter ?? DEFAULT_BREAK_AFTER,\n  };\n}\n\nfunction aggregatePhraseBreakInfo(phrases: Phrase[]): Phrase[] {\n  return phrases.map((phrase) => ({\n    ...phrase,\n    breakInfo:\n      phrase.tokens[phrase.tokens.length - 1].breakAfter ?? DEFAULT_BREAK_AFTER,\n  }));\n}\n\nfunction displayAsLines(phrases: Phrase[]): WordTimeline[][] {\n  const tokens = phrases.flatMap((phrase) => phrase.tokens);\n  const lines: WordTimeline[][] = [];\n  let current: WordTimeline[] = [];\n\n  for (let index = 0; index < tokens.length; index++) {\n    const token = tokens[index];\n    if (token.isWhitespaceToken) continue;\n\n    const nextVisible = tokens\n      .slice(index + 1)\n      .find((candidate) => !candidate.isWhitespaceToken);\n\n    const breakAfter = token.breakAfter ?? DEFAULT_BREAK_AFTER;\n    let hasWhitespace = breakAfter.hasWhitespace;\n    const hasNewLine = breakAfter.hasNewLine;\n    const shouldBreakLine = breakAfter.hasSeparator;\n\n    if (hasNewLine) {\n      hasWhitespace = false;\n    }\n\n    if (hasWhitespace && nextVisible) {\n      const latinLike =\n        isLatinLike(token.surface_form) ||\n        isLatinLike(nextVisible.surface_form);\n      if (!latinLike) {\n        hasWhitespace = false;\n      }\n    }\n\n    if (nextVisible) {\n      if (isOpenParenthesis(nextVisible) || isCloseParenthesis(nextVisible)) {\n        hasWhitespace = false;\n      }\n      if (isPunctuation(nextVisible)) {\n        hasWhitespace = false;\n      }\n    }\n\n    if (isPunctuation(token) && current.length > 0) {\n      const last = current[current.length - 1];\n      last.text += token.surface_form;\n      last.end = Number.parseFloat(token.end.toFixed(3));\n      last.hasWhitespace = false;\n      if (hasNewLine) {\n        last.hasNewLine = true;\n      }\n      if (shouldBreakLine) {\n        lines.push(current);\n        current = [];\n      }\n      continue;\n    }\n\n    current.push({\n      wordID: crypto.randomUUID(),\n      begin: Number.parseFloat(token.begin.toFixed(3)),\n      end: Number.parseFloat(token.end.toFixed(3)),\n      text: token.surface_form,\n      hasWhitespace,\n      hasNewLine,\n    });\n\n    if (shouldBreakLine) {\n      lines.push(current);\n      current = [];\n    }\n  }\n\n  if (current.length > 0) {\n    lines.push(current);\n  }\n\n  return lines;\n}\n\n/**\n * Tokenizes line arguments into phrases with break information.\n *\n * @breaking This function was changed from async to sync in v0.4.0.\n * Update call sites to remove `await` if previously used.\n * Note: Breaking changes in pre-1.0 versions are acceptable per semantic versioning;\n * a major version bump is not required until the API stabilizes at v1.0.0.\n *\n * @param props - Line arguments and tokenizer instance\n * @returns LineArgsTokenizerResult containing phrases and legacy createLineArgs map\n */\nexport function LineArgsTokenizer(props: {\n  lineArgs: CreateLineArgs;\n  tokenizer: Tokenizer<IpadicFeatures>;\n}): LineArgsTokenizerResult {\n  const { lineArgs, tokenizer } = props;\n  const result = new Map<number, CreateLineArgs>();\n  let position = 1;\n  const resultPhrases: Phrase[] = [];\n\n  for (const timeline of lineArgs.timelines) {\n    const parsedTokens = parseWithKuromoji(timeline, tokenizer);\n    const tokensWithBreak = generateBreaksOnTokens(parsedTokens, timeline.text);\n    const phrases = aggregatePhraseBreakInfo(\n      segmentByBreakAfter(tokensWithBreak),\n    );\n    resultPhrases.push(...phrases);\n    const lines = displayAsLines(phrases);\n\n    for (const line of lines) {\n      result.set(position, {\n        position,\n        timelines: line,\n      });\n      position += 1;\n    }\n  }\n\n  return {\n    result: {\n      lineID: crypto.randomUUID(),\n      phrases: resultPhrases,\n    },\n    createLineArgs: result,\n  };\n}\n\nexport default LineArgsTokenizer;\n", "import type { CreateLineArgs } from \"@ioris/core\";\nimport type { IpadicFeatures } from \"kuromoji\";\n\n/**\n * Kuromoji part-of-speech/subcategory constants (for readability and typo prevention)\n */\nexport const KUROMOJI_POS = {\n  ADJECTIVE_VERB: \"\u5F62\u5BB9\u52D5\u8A5E\",\n  ADJECTIVE: \"\u5F62\u5BB9\u8A5E\",\n  ADNOMINAL: \"\u9023\u4F53\u8A5E\",\n  ADVERB: \"\u526F\u8A5E\",\n  AUXILIARY_VERB: \"\u52A9\u52D5\u8A5E\",\n  CONJUNCTION: \"\u63A5\u7D9A\u8A5E\",\n  FILLER: \"\u30D5\u30A3\u30E9\u30FC\",\n  INTERJECTION: \"\u611F\u52D5\u8A5E\",\n  NOUN: \"\u540D\u8A5E\",\n  PARTICLE: \"\u52A9\u8A5E\",\n  PREFIX: \"\u63A5\u982D\u8A5E\",\n  SYMBOL: \"\u8A18\u53F7\",\n  VERB: \"\u52D5\u8A5E\",\n} as const;\n\nexport const KUROMOJI_POS_DETAIL1 = {\n  ADJECTIVE_VERB_BASE: \"\u5F62\u5BB9\u52D5\u8A5E\u8A9E\u5E79\",\n  ADVERBIAL_PARTICLE: \"\u526F\u52A9\u8A5E\",\n  ADVERBIAL: \"\u526F\u8A5E\u53EF\u80FD\",\n  ADVERBIALIZED: \"\u526F\u8A5E\u5316\",\n  COUNTER: \"\u52A9\u6570\u8A5E\",\n  BOUND_PARTICLE: \"\u4FC2\u52A9\u8A5E\",\n  CASE_PARTICLE: \"\u683C\u52A9\u8A5E\",\n  CLOSE_PARENTHESIS: \"\u62EC\u5F27\u9589\",\n  COMBINED_PARTICLE: \"\u526F\u52A9\u8A5E\uFF0F\u4E26\u7ACB\u52A9\u8A5E\uFF0F\u7D42\u52A9\u8A5E\",\n  COMMA: \"\u8AAD\u70B9\",\n  CONJUNCTIVE_PARTICLE: \"\u63A5\u7D9A\u52A9\u8A5E\",\n  PARTICLE_LIKE_CONNECTIVE: \"\u52A9\u8A5E\u985E\u63A5\u7D9A\",\n  COORDINATING_PARTICLE: \"\u4E26\u7ACB\u52A9\u8A5E\",\n  GENERAL: \"\u4E00\u822C\",\n  INDEPENDENT: \"\u81EA\u7ACB\",\n  NON_INDEPENDENT: \"\u975E\u81EA\u7ACB\",\n  NOUN_CONNECTION: \"\u540D\u8A5E\u63A5\u7D9A\",\n  NUMBER: \"\u6570\",\n  OPEN_PARENTHESIS: \"\u62EC\u5F27\u958B\",\n  PERIOD: \"\u53E5\u70B9\",\n  PREFIX: \"\u63A5\u982D\u8A5E\",\n  PRENOMINAL: \"\u9023\u4F53\u5316\",\n  PRONOUN: \"\u4EE3\u540D\u8A5E\",\n  PROPER_NOUN: \"\u56FA\u6709\u540D\u8A5E\",\n  SAHEN_CONNECTION: \"\u30B5\u5909\u63A5\u7D9A\",\n  SENTENCE_FINAL_PARTICLE: \"\u7D42\u52A9\u8A5E\",\n  SPACE: \"\u7A7A\u767D\",\n  SUFFIX: \"\u63A5\u5C3E\",\n  UNKNOWN: \"*\",\n} as const;\n\nexport type KuromojiPOS = (typeof KUROMOJI_POS)[keyof typeof KUROMOJI_POS];\nexport type KuromojiPOSDetail1 =\n  (typeof KUROMOJI_POS_DETAIL1)[keyof typeof KUROMOJI_POS_DETAIL1];\n\nexport type BreakReason = {\n  type: string;\n  detail?: string;\n};\n\nexport type BreakStrength = \"none\" | \"weak\" | \"medium\" | \"strong\";\n\nexport type StrengthOrder = {\n  [key in BreakStrength]: number;\n};\n\nexport type BreakAfter = {\n  hasSeparator: boolean;\n  hasNewLine: boolean;\n  hasWhitespace: boolean;\n  strength: BreakStrength;\n  reasons: BreakReason[];\n  score: number;\n};\n\nexport type ScriptType =\n  | \"hiragana\"\n  | \"katakana\"\n  | \"kanji\"\n  | \"latin\"\n  | \"number\"\n  | \"symbol\"\n  | \"other\";\n\nexport type TokenWithBreak = Omit<IpadicFeatures, \"pos\" | \"pos_detail_1\"> & {\n  pos: KuromojiPOS;\n  pos_detail_1: KuromojiPOSDetail1;\n  index: number;\n  begin: number;\n  end: number;\n  scriptType: ScriptType;\n  isWhitespaceToken: boolean;\n  breakAfter?: BreakAfter;\n};\n\nexport type Phrase = {\n  phraseID: string;\n  tokens: TokenWithBreak[];\n  fullText: string;\n  features: {\n    languageType: \"japanese\" | \"english\" | \"mixed\" | \"other\";\n    isParenthetical: boolean;\n    isRepetition: boolean;\n  };\n  breakInfo: BreakAfter;\n};\n\n/**\n * Line result combining phrase-level data and legacy timelines\n */\nexport interface LineResult {\n  /** Generated line ID */\n  readonly lineID: string;\n\n  /** Segmented phrases with breakInfo */\n  readonly phrases: readonly Phrase[];\n}\n\n/**\n * Aggregated result for multi-line processing\n */\nexport interface LineArgsTokenizerResult {\n  readonly result: LineResult;\n  readonly createLineArgs: Map<number, CreateLineArgs>;\n}\n"],
  "mappings": "AAEO,IAAMA,EAAoB,gBACpBC,EAAiC,QACjCC,EAAmB,aACnBC,EAAoB,cACpBC,EAAmB,yBACnBC,EAAc,QACdC,EAAmB,WAEnBC,EAAiC,CAC5C,KAAM,EACN,KAAM,EACN,OAAQ,EACR,OAAQ,CACV,EAEaC,EAAkC,OAAO,OAAO,CAC3D,aAAc,GACd,WAAY,GACZ,cAAe,GACf,SAAU,OACV,QAAS,CAAC,EACV,MAAO,CACT,CAAC,EAEYC,EAA4C,IAAI,IAAI,CAC/D,qBACA,qBACA,2BACA,oBACF,CAAC,EAEYC,EAA8B,IAAI,IAAI,CAAC,IAAK,MAAO,KAAM,MAAM,CAAC,EAChEC,EAAkC,IAAI,IAAI,CACrD,OACA,KACA,MACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,SACA,UACA,UACA,UACA,SACA,SACA,UACA,KACA,OACA,MACA,KACA,MACA,KACA,MACA,MACA,OACA,QACA,UACA,SACA,WACA,QACA,QACA,SACA,QACA,OACA,OACA,OACA,KACA,KACA,MACA,MACA,OACA,KACA,OACA,QACA,KACA,OACA,MACA,OACA,MACA,MACA,MACA,QACA,OACA,QACA,QACA,SACA,MACA,QACA,MACF,CAAC,EACYC,EAAgC,IAAI,IAAI,CACnD,OACA,KACA,MACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,SACA,UACA,UACA,UACA,SACA,SACA,UACA,KACA,OACA,MACA,KACA,MACA,KACA,MACA,MACA,OACA,QACA,UACA,SACA,WACA,QACA,QACA,SACA,QACA,OACA,OACA,OACA,KACA,KACA,MACA,MACA,OACA,KACA,OACA,QACA,KACA,OACA,MACA,OACA,MACA,MACA,MACA,QACA,OACA,QACA,QACA,SACA,MACA,QACA,MACF,CAAC,EACYC,EAAyB,EACzBC,EAA4B,EAE5BC,EAAoB,EACpBC,EAAe,EACfC,EAAsB,EACtBC,EAAe,EACfC,EAA2B,GAC3BC,EAA8B,EAE9BC,EAAuB,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",
  "names": ["PUNCTUATION_REGEX", "NO_SEPARATOR_PUNCTUATION_REGEX", "OPEN_PAREN_REGEX", "CLOSE_PAREN_REGEX", "PAREN_ONLY_REGEX", "SPACE_REGEX", "KANJI_ONLY_REGEX", "STRENGTH_WEIGHT", "DEFAULT_BREAK_AFTER", "CLAUSE_PARTICLES", "ENGLISH_PRONOUN_BREAK_WORDS", "ENGLISH_PRONOUN_BREAK_BLOCKLIST", "ENGLISH_LINE_BREAK_HINT_WORDS", "ENGLISH_LINE_WORDS_MIN", "ENGLISH_LINE_WORDS_TARGET", "CLOSE_PAREN_SCORE", "CLAUSE_SCORE", "SCRIPT_CHANGE_SCORE", "LENGTH_SCORE", "PAREN_CONTENT_MIN_LENGTH", "MIN_PHRASE_LENGTH_FOR_BREAK", "SCRIPT_TYPE_PATTERNS", "BOUNDARY_SCORE_RULES", "KANJI_ONLY_REGEX", "OPEN_PAREN_REGEX", "BOUNDARY_OVERRIDE_RULES", "CLOSE_PAREN_REGEX", "BOUNDARY_RESTORE_RULES", "LANGUAGE_TYPE_RULES", "scriptTypes", "detectScriptType", "text", "SCRIPT_TYPE_PATTERNS", "PUNCTUATION_REGEX", "OPEN_PAREN_REGEX", "mapScoreToStrength", "score", "matchesRuleCondition", "token", "condition", "pattern", "isLatinLike", "isEnglishConnectorToken", "collectEnglishWordSegments", "tokens", "segments", "current", "isEnglishBoundary", "prevToken", "nextToken", "shouldForceEnglishPronounBreak", "nextWord", "ENGLISH_PRONOUN_BREAK_WORDS", "ENGLISH_PRONOUN_BREAK_BLOCKLIST", "applyEnglishWordBreaks", "segment", "cursor", "remaining", "ENGLISH_LINE_WORDS_TARGET", "breakAt", "size", "ENGLISH_LINE_WORDS_MIN", "nextIndex", "ENGLISH_LINE_BREAK_HINT_WORDS", "breakTokenIndex", "breakToken", "mergeBreakAfter", "createBreakAfter", "isJapaneseScriptType", "scriptType", "props", "strength", "next", "stronger", "STRENGTH_WEIGHT", "updateBreakAfter", "updates", "newReason", "findAdjacentVisibleTokens", "index", "nextNextToken", "visibleCount", "i", "hasExplicitBoundaryReason", "breakAfter", "reason", "canSuppressBreak", "suppressShortPhrases", "visibleTokens", "phraseStart", "currentLength", "MIN_PHRASE_LENGTH_FOR_BREAK", "currentBreak", "isPunctuation", "isCloseParenthesis", "CLOSE_PAREN_REGEX", "isOpenParenthesis", "isClauseBoundary", "CLAUSE_PARTICLES", "scriptChanged", "exceedsLength", "threshold", "parseWithKuromoji", "timeline", "tokenizer", "PAREN_ONLY_REGEX", "char", "cleanedLength", "durationByChar", "duration", "begin", "end", "SPACE_REGEX", "detectWhitespaceBreak", "forceEnglishPronounBreak", "hasNewLine", "applyExplicitWhitespace", "lastVisibleIndex", "between", "explicitBreak", "lastToken", "generateBreaksOnTokens", "parsedTokens", "visibleIndices", "nextVisible", "candidate", "reasons", "CLAUSE_SCORE", "CLOSE_PAREN_SCORE", "SCRIPT_CHANGE_SCORE", "LENGTH_SCORE", "rule", "BOUNDARY_SCORE_RULES", "shouldBreakLine", "hasSeparator", "NO_SEPARATOR_PUNCTUATION_REGEX", "depth", "innerLength", "PAREN_CONTENT_MIN_LENGTH", "hasExplicitSpace", "hasExplicitNewline", "prev", "BOUNDARY_OVERRIDE_RULES", "visIdx", "nextNextVisible", "prevVisible", "BOUNDARY_RESTORE_RULES", "phraseIdx", "segmentByBreakAfter", "phrases", "buildPhrase", "last", "fullText", "t", "scriptTypes", "languageType", "LANGUAGE_TYPE_RULES", "DEFAULT_BREAK_AFTER", "aggregatePhraseBreakInfo", "phrase", "displayAsLines", "lines", "hasWhitespace", "LineArgsTokenizer", "lineArgs", "result", "position", "resultPhrases", "tokensWithBreak", "line", "KUROMOJI_POS", "KUROMOJI_POS_DETAIL1"]
}
