{"version":3,"file":"HospitalAddressLocalization.BpsbwDS8.mjs","names":[],"sources":["https:/framerusercontent.com/modules/64Oqi4Uooa8F0hUJmJS3/PWj1986GPdysAeYEwqA5/HospitalAddressLocalization.js"],"sourcesContent":["const MAJOR_REGION_EN_BY_KO={서울:\"Seoul\",서울특별시:\"Seoul\",부산:\"Busan\",부산광역시:\"Busan\",대구:\"Daegu\",대구광역시:\"Daegu\",인천:\"Incheon\",인천광역시:\"Incheon\",광주:\"Gwangju\",광주광역시:\"Gwangju\",대전:\"Daejeon\",대전광역시:\"Daejeon\",울산:\"Ulsan\",울산광역시:\"Ulsan\",세종:\"Sejong\",세종특별자치시:\"Sejong\",경기:\"Gyeonggi-do\",경기도:\"Gyeonggi-do\",강원:\"Gangwon State\",강원도:\"Gangwon State\",강원특별자치도:\"Gangwon State\",충북:\"Chungcheongbuk-do\",충청북도:\"Chungcheongbuk-do\",충남:\"Chungcheongnam-do\",충청남도:\"Chungcheongnam-do\",전북:\"Jeonbuk State\",전라북도:\"Jeonbuk State\",전북특별자치도:\"Jeonbuk State\",전남:\"Jeollanam-do\",전라남도:\"Jeollanam-do\",경북:\"Gyeongsangbuk-do\",경상북도:\"Gyeongsangbuk-do\",경남:\"Gyeongsangnam-do\",경상남도:\"Gyeongsangnam-do\",제주:\"Jeju Special Self-Governing Province\",제주도:\"Jeju Special Self-Governing Province\",제주특별자치도:\"Jeju Special Self-Governing Province\"};const SEOUL_DISTRICT_EN_BY_KO={종로구:\"Jongno-gu\",중구:\"Jung-gu\",용산구:\"Yongsan-gu\",성동구:\"Seongdong-gu\",광진구:\"Gwangjin-gu\",동대문구:\"Dongdaemun-gu\",중랑구:\"Jungnang-gu\",성북구:\"Seongbuk-gu\",강북구:\"Gangbuk-gu\",도봉구:\"Dobong-gu\",노원구:\"Nowon-gu\",은평구:\"Eunpyeong-gu\",서대문구:\"Seodaemun-gu\",마포구:\"Mapo-gu\",양천구:\"Yangcheon-gu\",강서구:\"Gangseo-gu\",구로구:\"Guro-gu\",금천구:\"Geumcheon-gu\",영등포구:\"Yeongdeungpo-gu\",동작구:\"Dongjak-gu\",관악구:\"Gwanak-gu\",서초구:\"Seocho-gu\",강남구:\"Gangnam-gu\",송파구:\"Songpa-gu\",강동구:\"Gangdong-gu\"};const ADMIN_DIVISION_EN_BY_KO={서초구:\"Seocho-gu\",분당구:\"Bundang-gu\",성남시:\"Seongnam-si\",원주시:\"Wonju-si\"};const TOKEN_EN_BY_KO={강남대로:\"Gangnam-daero\",판교역로:\"Pangyo-yeok-ro\",능라동길:\"Neungnadong-gil\",테헤란로:\"Teheran-ro\",송도과학로:\"Songdo-gwahak-ro\",센텀남대로:\"Centum-nam-daero\"};const INITIALS=[\"g\",\"kk\",\"n\",\"d\",\"tt\",\"r\",\"m\",\"b\",\"pp\",\"s\",\"ss\",\"\",\"j\",\"jj\",\"ch\",\"k\",\"t\",\"p\",\"h\"];const MEDIALS=[\"a\",\"ae\",\"ya\",\"yae\",\"eo\",\"e\",\"yeo\",\"ye\",\"o\",\"wa\",\"wae\",\"oe\",\"yo\",\"u\",\"wo\",\"we\",\"wi\",\"yu\",\"eu\",\"ui\",\"i\"];const FINALS=[\"\",\"k\",\"k\",\"ks\",\"n\",\"nj\",\"nh\",\"t\",\"l\",\"lk\",\"lm\",\"lb\",\"ls\",\"lt\",\"lp\",\"lh\",\"m\",\"p\",\"ps\",\"t\",\"t\",\"ng\",\"t\",\"t\",\"k\",\"t\",\"p\",\"h\"];function romanizeHangulSyllables(value){let result=\"\";for(const char of value){const code=char.charCodeAt(0);if(code<44032||code>55203){result+=/[a-z0-9-]/i.test(char)?char.toLowerCase():\"\";continue;}const syllableIndex=code-44032;const initialIndex=Math.floor(syllableIndex/(21*28));const medialIndex=Math.floor(syllableIndex%(21*28)/28);const finalIndex=syllableIndex%28;result+=`${INITIALS[initialIndex]}${MEDIALS[medialIndex]}${FINALS[finalIndex]}`;}return result.replace(/[^a-z0-9]+/g,\"\");}function toRomanizedKoreanToken(token){const source=String(token??\"\").trim();if(!source)return\"\";if(TOKEN_EN_BY_KO[source])return TOKEN_EN_BY_KO[source];const suffixRules=[{suffix:\"대로\",en:\"daero\"},{suffix:\"로\",en:\"ro\"},{suffix:\"길\",en:\"gil\"},{suffix:\"구\",en:\"gu\"},{suffix:\"시\",en:\"si\"},{suffix:\"군\",en:\"gun\"}];for(const rule of suffixRules){if(!source.endsWith(rule.suffix))continue;const base=source.slice(0,source.length-rule.suffix.length);const romanizedBase=romanizeHangulSyllables(base);if(!romanizedBase)return\"\";const full=`${romanizedBase}-${rule.en}`;return full.charAt(0).toUpperCase()+full.slice(1);}return\"\";}function normalizeSpace(value){return String(value??\"\").replace(/\\s+/g,\" \").trim();}function removeRedundantParentheticalLegalDong(input){const source=normalizeSpace(input);if(!source)return\"\";return source.replace(/\\(([^)]+)\\)/g,(segment,innerRaw)=>{const inner=normalizeSpace(innerRaw);if(!inner)return\"\";if(!/(동|리|가)/.test(inner))return segment;const outer=normalizeSpace(source.replace(segment,\" \"));const normalizedInner=inner.replace(/\\s+/g,\"\");const normalizedOuter=outer.replace(/\\s+/g,\"\");return normalizedOuter.includes(normalizedInner)?\"\":segment;});}function extractFloorLabel(input){let remaining=input;let floorLabel=\"\";const patterns=[{regex:/지하\\s*(\\d+)\\s*층/i,toLabel:m=>`B${m[1]}`},{regex:/\\bB\\s*([0-9]+)\\s*층?\\b/i,toLabel:m=>`B${m[1]}`},{regex:/(\\d+)\\s*층/,toLabel:m=>`${m[1]}F`}];for(const pattern of patterns){const match=remaining.match(pattern.regex);if(!match)continue;floorLabel=pattern.toLabel(match);remaining=normalizeSpace(remaining.replace(match[0],\" \"));break;}return{floorLabel,remaining};}export function parseKoreanRoadAddress(address){const cleaned=removeRedundantParentheticalLegalDong(String(address??\"\"));const{floorLabel,remaining}=extractFloorLabel(cleaned);const tokens=normalizeSpace(remaining).split(/[,\\s]+/).map(token=>token.trim()).filter(Boolean);let provinceOrMetro=\"\";let city=\"\";let districtOrCounty=\"\";let roadWithNumber=\"\";const consumed=new Set;tokens.forEach((token,index)=>{if(!provinceOrMetro&&MAJOR_REGION_EN_BY_KO[token]){provinceOrMetro=MAJOR_REGION_EN_BY_KO[token];consumed.add(index);}});tokens.forEach((token,index)=>{if(consumed.has(index))return;if(!districtOrCounty){if(provinceOrMetro===\"Seoul\"&&SEOUL_DISTRICT_EN_BY_KO[token]){districtOrCounty=SEOUL_DISTRICT_EN_BY_KO[token];consumed.add(index);return;}if(token.endsWith(\"구\")||token.endsWith(\"군\")){districtOrCounty=ADMIN_DIVISION_EN_BY_KO[token]||toRomanizedKoreanToken(token);if(districtOrCounty)consumed.add(index);}}});tokens.forEach((token,index)=>{if(consumed.has(index))return;if(!city&&token.endsWith(\"시\")){city=ADMIN_DIVISION_EN_BY_KO[token]||toRomanizedKoreanToken(token);if(city)consumed.add(index);}});for(let index=0;index<tokens.length;index+=1){if(consumed.has(index))continue;const token=tokens[index];const isRoad=token.endsWith(\"대로\")||token.endsWith(\"로\")||token.endsWith(\"길\");if(!isRoad)continue;const roadEn=TOKEN_EN_BY_KO[token]||toRomanizedKoreanToken(token);if(!roadEn)continue;const nextToken=tokens[index+1]??\"\";const roadNumber=/^[0-9]+(?:-[0-9]+)?$/.test(nextToken)?nextToken:\"\";consumed.add(index);if(roadNumber)consumed.add(index+1);roadWithNumber=roadNumber?`${roadNumber} ${roadEn}`:roadEn;break;}const detailTokens=tokens.filter((_,index)=>!consumed.has(index));const detailLabel=detailTokens.join(\" \");const detailWithFloor=[floorLabel,detailLabel].filter(Boolean).join(\" \");return{floorLabel:detailWithFloor,roadWithNumber,districtOrCounty,city,provinceOrMetro};}export function formatKoreanAddressToEnglish(address){const original=String(address??\"\");if(!original.trim())return\"\";const parsed=parseKoreanRoadAddress(original);const parts=[parsed.floorLabel,parsed.roadWithNumber,parsed.districtOrCounty,parsed.city,parsed.provinceOrMetro,\"South Korea\"].filter(Boolean);const deduped=[];const seen=new Set;parts.forEach(part=>{const key=part.toLowerCase().replace(/\\s+/g,\" \").trim();if(!key||seen.has(key))return;seen.add(key);deduped.push(part);});const hasStructuredCore=Boolean(parsed.roadWithNumber&&parsed.provinceOrMetro);return hasStructuredCore?deduped.join(\", \"):\"\";}export const HOSPITAL_ADDRESS_LOCALIZATION_FIXTURES=[{label:\"Seoul Seocho Gangnam-daero 437 7F\",input:\"서울특별시 서초구 강남대로 437 7층\",expectedIncludes:[\"7F\",\"437 Gangnam-daero\",\"Seocho-gu\",\"Seoul\",\"South Korea\"]},{label:\"Gyeonggi Seongnam Bundang Pangyo-yeok-ro 235\",input:\"경기도 성남시 분당구 판교역로 235\",expectedIncludes:[\"235 Pangyo-yeok-ro\",\"Bundang-gu\",\"Seongnam-si\",\"Gyeonggi-do\",\"South Korea\"]},{label:\"Gangwon Wonju Neungnadong-gil 61 3F\",input:\"강원특별자치도 원주시 능라동길 61 3층\",expectedIncludes:[\"3F\",\"61 Neungnadong-gil\",\"Wonju-si\",\"Gangwon State\",\"South Korea\"]},{label:\"Incheon sample\",input:\"인천광역시 연수구 송도과학로 32\",expectedIncludes:[\"32 Songdo-gwahak-ro\",\"Yeonsu-gu\",\"Incheon\",\"South Korea\"]},{label:\"Busan metropolitan sample\",input:\"부산광역시 해운대구 센텀남대로 35\",expectedIncludes:[\"35 Centum-nam-daero\",\"Haeundae-gu\",\"Busan\",\"South Korea\"]},{label:\"Building/floor sample with basement\",input:\"서울특별시 강남구 테헤란로 152 (역삼동) 강남파이낸스센터 지하 1층\",expectedIncludes:[\"B1\",\"152 Teheran-ro\",\"Gangnam-gu\",\"Seoul\",\"South Korea\"]}];export function runHospitalAddressLocalizationFixtures(){const failures=[];HOSPITAL_ADDRESS_LOCALIZATION_FIXTURES.forEach(fixture=>{const output=formatKoreanAddressToEnglish(fixture.input);if(!output){failures.push(`${fixture.label}: empty output`);return;}fixture.expectedIncludes.forEach(expected=>{if(!output.includes(expected)){failures.push(`${fixture.label}: missing \"${expected}\" in \"${output}\"`);}});});return{ok:failures.length===0,failures};}\nexport const __FramerMetadata__ = {\"exports\":{\"HOSPITAL_ADDRESS_LOCALIZATION_FIXTURES\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"runHospitalAddressLocalizationFixtures\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"formatKoreanAddressToEnglish\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseKoreanRoadAddress\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ParsedKoreanAddress\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HospitalAddressLocalization.map"],"mappings":"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"}