{"version":3,"file":"index.cjs","sources":["../src/getLastChar.ts","../src/resolve.ts","../src/ko.ts"],"sourcesContent":["// str is guaranteed to be non-empty so this won't throw\nconst getLastChar = (str: string): string => (str = str.replace(/'|\"|\\([^)]*\\)/g, ''))[str.length - 1]\n\nexport { getLastChar }\n","import { getLastChar } from './getLastChar'\n\nconst ppMap: readonly [string, readonly [string, string]][] = [\n  ['(은)는', ['은', '는']],\n  ['(이)가', ['이', '가']],\n  ['(을)를', ['을', '를']],\n  ['(과)와', ['과', '와']],\n  ['(으)로', ['으로', '로']],\n  ['(이)여', ['이어', '여']],\n  ['(이)', ['이', '']],\n  ['(아)야', ['아', '야']],\n]\nconst foreignCharsRecord: Readonly<Record<string, number>> = {\n  0: 1,\n  1: 8,\n  3: 1,\n  6: 1,\n  7: 8,\n  8: 8,\n  b: 1,\n  c: 1,\n  g: 1,\n  k: 1,\n  l: 8,\n  m: 1,\n  n: 1,\n  p: 1,\n}\n\nconst hasNoCoda = (char: string, ignore_ㄹ: boolean): boolean => {\n  let coda = char >= '가' && char <= '힣' ? (char.charCodeAt(0) - 16) % 28 : foreignCharsRecord[char]\n  return !coda || (ignore_ㄹ && coda == 8)\n}\n\n/**\n * Returns a proper postposition from given `tokenString` based on the `testString`.\n *\n * Note that `resolve()` does not support decomposed (NFD) Hangul characters.\n * Use [`testString.normalize('NFC')`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize) if you need to.\n *\n * @param tokenString A string starting with one of supported Korean postposition tokens. `(은)는`, `(이)가`, `(을)를`, `(과)와`, `(으)로`, `(이)여`, `(이)`, and `(아)야` are available.\n * @param testString A string to resolve the token against.\n * @returns A tuple containing: The token extracted and a resolved postposition. Returns `null` if the token is not one of the supported ones.\n * @example\n * resolve('(은)는', '사과')\n * // ['(은)는', '는']\n *\n * resolve('(이)야말로', '공급관')\n * // ['(이)', '이']\n * resolve('(이)야말로', '공급자')\n * // ['(이)', '']\n */\nconst resolve = (tokenString: string, testString: string): readonly [token: string, postposition: string] | null => {\n  let foundPair = ppMap.find((pair) => tokenString.startsWith(pair[0]))\n  return foundPair ? [foundPair[0], foundPair[1][+hasNoCoda(getLastChar(testString), foundPair[0] == '(으)로')]] : null\n}\n\nexport { resolve }\n","import { resolve } from './resolve'\n\ntype Parameter = string | readonly [display: string, pronunciation: string]\n\n/**\n * Replaces all postposition tokens right after a template slot to a proper one.\n *\n * `(은)는`, `(이)가`, `(을)를`, `(과)와`, `(으)로`, `(이)여`, `(이)`, and `(아)야` are available.\n *\n * Note that `ko()` does not support decomposed (NFD) Hangul characters.\n * Use [`${word.normalize('NFC')}`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize) if you need to.\n *\n * @example\n * ko`그러자 ${name}(을)를 찾으며 말씀하시었으니, \"${name}\"(아)야, 어디 있느냐?`\n * // name=재민: 그러자 재민을 찾으며 말씀하시었으니, 재민아, 어디 있느냐?\n * // name=민재: 그러자 민재를 찾으며 말씀하시었으니, 민재야, 어디 있느냐?\n *\n * const pronunciation = '슈프림'\n * ko`${[word, pronunciation]}(이)야말로 최고의 피자다.`\n * // Supreme이야말로 최고의 피자다.\n */\nconst ko = (template: Readonly<TemplateStringsArray>, ...words: readonly Parameter[]): string =>\n  words.reduce<string>((acc, word, index) => {\n    let withoutPronunciation = '' + word === word // typeof string\n\n    // template is always 1 length longer, this should be safe\n    let succeeding = template[index + 1]\n    let tokenInfo = resolve(succeeding, withoutPronunciation ? (word as string) : word[1])\n\n    return (\n      acc +\n      (withoutPronunciation ? (word as string) : word[0]) +\n      (tokenInfo ? tokenInfo[1] + succeeding.slice(tokenInfo[0].length) : succeeding)\n    )\n  }, template[0])\n\nexport { ko }\n"],"names":[],"mappings":";;;;AACA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAA,CAAyB,GAAM,GAAA,GAAA,CAAI,OAAQ,CAAA,gBAAA,EAAkB,EAAE,CAAA,EAAG,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;;ACCrG,MAAM,KAAwD,GAAA;AAAA,EAC5D,CAAC,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACnB,CAAC,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACnB,CAAC,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACnB,CAAC,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACnB,CAAC,MAAA,EAAQ,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACpB,CAAC,MAAA,EAAQ,CAAC,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACpB,CAAC,KAAA,EAAO,CAAC,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACjB,CAAC,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AACrB,CAAA,CAAA;AACA,MAAM,kBAAuD,GAAA;AAAA,EAC3D,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AAAA,EACH,CAAG,EAAA,CAAA;AACL,CAAA,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,IAAA,EAAc,QAA+B,KAAA;AAC9D,EAAA,IAAI,IAAO,GAAA,IAAA,IAAQ,GAAO,IAAA,IAAA,IAAQ,GAAO,GAAA,CAAA,IAAA,CAAK,UAAW,CAAA,CAAC,CAAI,GAAA,EAAA,IAAM,EAAK,GAAA,kBAAA,CAAmB,IAAI,CAAA,CAAA;AAChG,EAAO,OAAA,CAAC,IAAS,IAAA,QAAA,IAAY,IAAQ,IAAA,CAAA,CAAA;AACvC,CAAA,CAAA;AAoBM,MAAA,OAAA,GAAU,CAAC,WAAA,EAAqB,UAA8E,KAAA;AAClH,EAAI,IAAA,SAAA,GAAY,KAAM,CAAA,IAAA,CAAK,CAAC,IAAA,KAAS,YAAY,UAAW,CAAA,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,CAAA;AACpE,EAAA,OAAO,YAAY,CAAC,SAAA,CAAU,CAAC,CAAG,EAAA,SAAA,CAAU,CAAC,CAAE,CAAA,CAAC,UAAU,WAAY,CAAA,UAAU,GAAG,SAAU,CAAA,CAAC,KAAK,MAAM,CAAC,CAAC,CAAI,GAAA,IAAA,CAAA;AACjH;;AClCM,MAAA,EAAA,GAAK,CAAC,QAA6C,EAAA,GAAA,KAAA,KACvD,MAAM,MAAe,CAAA,CAAC,GAAK,EAAA,IAAA,EAAM,KAAU,KAAA;AACzC,EAAI,IAAA,oBAAA,GAAuB,KAAK,IAAS,KAAA,IAAA,CAAA;AAGzC,EAAI,IAAA,UAAA,GAAa,QAAS,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AACnC,EAAA,IAAI,YAAY,OAAQ,CAAA,UAAA,EAAY,uBAAwB,IAAkB,GAAA,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA;AAErF,EAAA,OACE,OACC,oBAAwB,GAAA,IAAA,GAAkB,IAAK,CAAA,CAAC,MAChD,SAAY,GAAA,SAAA,CAAU,CAAC,CAAA,GAAI,WAAW,KAAM,CAAA,SAAA,CAAU,CAAC,CAAA,CAAE,MAAM,CAAI,GAAA,UAAA,CAAA,CAAA;AAExE,CAAG,EAAA,QAAA,CAAS,CAAC,CAAC;;;;;"}