{"version":3,"sources":["jsdelivr-header.js","/npm/cox-postposition@1.4.1/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACOA,MAAM,cAAgB,MAQhB,eAAiB,MAQjB,iBAAmB,yBAQnB,gBAAkB,qBAQlB,iBAAmB,IAAI,OAAO,MAAM,CACtC,uBACF,KAAK,SAAU,KAQX,iBAAmB,IAAI,OAAO,MAAM,CACtC,cACA,QACA,YACA,qBACA,wBACA,wCACA,2BACA,qBACA,2BACA,gBACF,KAAK,SAAU,KAQX,eAAiB,IAAI,OAAO,MAAM,CACpC,SACA,QACA,QACA,UACF,KAAK,SAAU,KAQX,mBAAqB,0CAQrB,qBAAuB,CACzB,IAAK,IACL,IAAK,IACL,IAAK,IACL,KAAM,IACN,IAAK,IACL,KAAM,KAUJ,qBAAuB,MACzB,MAAM,EAAU,CAAC,EAEjB,IAAK,MAAM,KAAO,qBACd,EAAQ,qBAAqB,IAAQ,EAGzC,OAAO,CACV,EAR4B,GAkBvB,UAAY,CAAC,EAAM,KACjB,iBAAiB,KAAK,KAKnB,iBAAiB,KAAK,KAAW,GAAQ,eAAe,KAAK,IAWlE,UAAY,CAAC,EAAM,KACrB,MAAM,GAAsB,EAtIV,OAsIkC,GAGpD,OAA8B,IAAvB,KAA8B,GAA+B,IAAvB,EAAyB,EAUpE,YAAc,IAChB,MAAM,SAAc,EAEpB,MAAgB,WAAT,GAA8B,WAAT,CAAiB,EAY3C,eAAiB,CAAC,EAAQ,EAAM,EAAQ,IAAY,IAAI,EAAM,EAAQ,UAUrE,MAAM,MAAQ,CAAC,EAAM,EAAO,QAC/B,GAAI,YAAY,GACZ,OAAO,EAGX,MAAM,EAAS,OAAO,GAAM,QAAQ,iBAAkB,KAAK,QAAQ,gBAAiB,MAC9E,EAAO,EAAO,OAAO,EAAO,OAAS,GAAG,aAExC,EAAgB,MAAT,GAAyB,OAAT,EAE7B,OAtLkB,OAmLgB,GAAQ,GA3KvB,MA8KD,UAAU,EAAM,GAAQ,UAAU,EAAQ,EAAK,SAa9D,MAAM,KAAO,CAAC,EAAM,EAAM,EAAU,QAChB,iBAAZ,IAEP,EAAU,qBADV,EAAO,qBAAqB,IAAS,GAAQ,KACL,GAGrC,MAAM,OAAO,GAAO,GAAQ,EAAU,UAY1C,MAAM,IAAM,CAAC,EAAM,EAAM,EAAU,OAAS,GAAG,IAAO,KAAK,EAAM,EAAM,YAUvE,MAAM,IAAM,CAAC,EAAM,IAAa,GAAQ,IAAI,EAAM,EAAM,UAUxD,MAAM,MAAS,GAAkC,iBAAb,EACvC,EAAS,QAAQ,mBAAoB,gBAAkB,gBAG5C,CACX,YACA,UACA,QACA,QACA","file":"/npm/cox-postposition@1.4.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/cox-postposition@1.4.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * 한글 조사\n *\n * @author Park U-yeong (ascript0@gmail.com)\n * @license MIT\n */\n\n/**\n * 한글 시작 유니 코드\n *\n * @private\n * @type {number}\n */\nconst KO_START_CODE = 44032;\n\n/**\n * 한글 종료 유니 코드\n *\n * @private\n * @type {number}\n */\nconst KO_FINISH_CODE = 55203;\n\n/**\n * 종성을 체크하지 않을 글자 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_INVALID_CHAR = /[^a-zA-Z0-9ㄱ-ㅎ가-힣\\s]+/g;\n\n/**\n * 종성을 체크할 글자 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_TARGET_CHAR = /^[\\s\\S]*?(\\S*)\\s*$/;\n\n/**\n * 종성이 없는 조건 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_NORMAL_FIXED = new RegExp(`(?:${[\n    'check|[hm]ook|limit',\n].join('|')})$`, 'i');\n\n/**\n * 종성이 있는 조건 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_SPECIAL_CHAR = new RegExp(`(?:${[\n    '[ㄱ-ㄷㅁ-ㅎ036]',\n    '^[mn]',\n    '\\\\S[mn]e?',\n    '\\\\S(?:[aeiom]|lu)b',\n    '(?:u|\\\\S[aei]|[^o]o)p',\n    '(?:^i|[^auh]i|\\\\Su|[^ei][ae]|[^oi]o)t',\n    '(?:\\\\S[iou]|[^e][ae])c?k',\n    '\\\\S[aeiou](?:c|ng)',\n    'foot|go+d|b[ai]g|private',\n    '^(?:app|kor)',\n].join('|')})$`, 'i');\n\n/**\n * 조사가 '로'일 때 종성이 없는 조건으로 간주하는 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_SPECIAL_RO = new RegExp(`(?:${[\n    '[178ㄹ]',\n    '^[lr]',\n    '^\\\\Sr',\n    '\\\\Sle?',\n].join('|')})$`, 'i');\n\n/**\n * 조사를 처리할 단어를 찾는 정규식\n *\n * @private\n * @type {RegExp}\n */\nconst REG_PARSER_PATTERN = /(\\S*)\\[([\\w가-힣]*)(?:\\*|\\|([\\w가-힣]*))\\]/g;\n\n/**\n * 기본적으로 지원하는 조사\n *\n * @private\n * @type {object}\n */\nconst DEFAULT_POSTPOSITION = {\n    '은': '는',\n    '이': '가',\n    '과': '와',\n    '이나': '나',\n    '을': '를',\n    '으로': '로',\n};\n\n/**\n * 종성이 있는 단어의 조사\n * 기본 조사의 key/value를 반대로 정의한 객체\n *\n * @private\n * @type {object}\n */\nconst SPECIAL_POSTPOSITION = (() => {\n    const special = {};\n\n    for (const key in DEFAULT_POSTPOSITION) {\n        special[DEFAULT_POSTPOSITION[key]] = key;\n    }\n\n    return special;\n})();\n\n/**\n * 종성이 있는 문자열 체크\n *\n * @private\n * @param text {string} 종성이 있는지를 확인할 문자열\n * @param isRo {boolean} 조사가 '로/으로'인지 여부\n * @return {boolean}\n */\nconst checkText = (text, isRo) => {\n    if (REG_NORMAL_FIXED.test(text)) {\n        return false;\n    }\n\n    // 한글 외에 'ㄹ' 종성 판단은 종성 유무 조건과 분리하여 개별 처리\n    return REG_SPECIAL_CHAR.test(text) || (!isRo && REG_SPECIAL_RO.test(text));\n};\n\n/**\n * 종성이 있는 한글의 유니 코드 체크\n *\n * @private\n * @param code {number} 유니 코드\n * @param isRo {boolean} 조사가 '로/으로'인지 여부\n * @returns {boolean}\n */\nconst checkCode = (code, isRo) => {\n    const finalConsonantCode = (code - KO_START_CODE) % 28;\n\n    // 종성이 있는 경우를 체크하고, 조사 '로'일 때 종성이 'ㄹ'인지 여부 추가 체크\n    return finalConsonantCode !== 0 && !(isRo && finalConsonantCode === 8);\n};\n\n/**\n * 문자열로 사용 가능한지 여부 체크\n *\n * @private\n * @param text {any}\n * @returns {boolean}\n */\nconst invalidText = text => {\n    const type = typeof text;\n\n    return type !== 'string' && type !== 'number';\n};\n\n/**\n * 문장에서 찾은 패턴을 처리하는 callback function\n *\n * @private\n * @param target 패턴과 일치하는 문자열\n * @param word 대상 단어\n * @param normal 종성이 없을 때 조사\n * @param special 종성이 있을 때 조사\n */\nconst callbackParser = (target, word, normal, special) => put(word, normal, special);\n\n/**\n * 종성이 있는 문자열인지 여부\n * '로/으로'의 경우가 아니면 type 파라미터를 생략해도 된다.\n *\n * @param text {string} 체크할 문자열\n * @param type {string|null} 조사('로/으로'의 경우가 아니면 type 파라미터를 생략)\n * @returns {boolean}\n */\nexport const check = (text, type = null) => {\n    if (invalidText(text)) {\n        return false;\n    }\n\n    const target = String(text).replace(REG_INVALID_CHAR, ' ').replace(REG_TARGET_CHAR, '$1');\n    const code = target.charAt(target.length - 1).charCodeAt();\n    const isKorean = KO_START_CODE <= code && code <= KO_FINISH_CODE;\n    const isRo = type === '로' || type === '으로';\n\n    return isKorean ? checkCode(code, isRo) : checkText(target, isRo);\n};\n\n/**\n * 글자에 해당하는 조사를 반환\n * 아래 조사에 대해서는 special 파라미터를 전달하지 않아도 된다.\n * 은/는, 이/가, 을/를, 과/와, 나/이나, 로/으로\n *\n * @param text {string} 조사를 붙일 문자열\n * @param type {string} 조사\n * @param special {string|null} 종성이 있을 때 조사\n * @returns {string}\n */\nexport const pick = (text, type, special = null) => {\n    if (typeof special !== 'string') {\n        type = DEFAULT_POSTPOSITION[type] || type || '';\n        special = SPECIAL_POSTPOSITION[type] || type;\n    }\n\n    return check(String(text), type) ? special : type;\n};\n\n/**\n * 글자에 해당하는 조사를 붙인 글자를 반환\n * pick 메서드의 사용법과 동일하다.\n *\n * @param text {string} 조사를 붙일 문자열\n * @param type {string} 조사\n * @param special {string|null} 종성이 있을 때 조사\n * @return {string}\n */\nexport const put = (text, type, special = null) => `${text}${pick(text, type, special)}`;\n\n/**\n * 특정 조사를 처리하는 함수를 반환\n * 같은 조사에 대한 처리가 반복되는 경우 특정 조사를 처리하는 함수를 생성하여 처리할 글자만 전달하여 사용한다.\n *\n * @param type {string} 조사\n * @param special {string|null} 종성이 없을 때 조사\n * @return {function}\n */\nexport const fix = (type, special) => (text => put(text, type, special));\n\n/**\n * 문자열에서 특정 패턴을 찾아 해당 문자에 맞는 조사를 처리\n * 찾는 패턴 : '단어[ 기본 지원 조사 * ]' 혹은 '단어[ 종성이 없을 때 조사 | 종성이 있을 때 조사 ]'\n * ex) '문자열[를*] 변경', '문자열[를|을] 변경' => 문자열을 변경\n *\n * @param sentence {string} 처리할 문자열\n * @returns {string}\n */\nexport const parse = (sentence) => (typeof sentence === 'string') ?\n    sentence.replace(REG_PARSER_PATTERN, callbackParser) : sentence;\n\n\nexport default {\n    check,\n    pick,\n    put,\n    fix,\n    parse,\n}\n"]}