교대 이름을 전체 명칭으로 해석하고, 엑셀 가져오기 문제를 목록으로 모은다. 교각 이름과의 중복을 저장 파일 검사에서도 막는다(checkStoredAbutments). 검사 스크립트 verify-abut-names · verify-abut-workflow 포함. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
/**
|
|
* 구조물 목록 순서 (2026-11-03, 교대 AB): 시점 교대(A1) → 교각 P1 … Pn → 종점 교대(A2), 교대가 여럿이면 번호 순.
|
|
* Pure. Used by the 구조물 목록 so the abutments sit at the two ends of the bridge.
|
|
*/
|
|
export interface StructureRef {
|
|
kind: 'pier' | 'abut';
|
|
name: string;
|
|
/** 교대 형식 (A1 · A2), only for abutments. */
|
|
type?: 'A1' | 'A2';
|
|
}
|
|
|
|
const nameOrder = new Intl.Collator('ko', { numeric: true });
|
|
|
|
export function structureOrder(abutments: { name: string; type: 'A1' | 'A2' }[], piers: string[]): StructureRef[] {
|
|
const start = abutments.filter((a) => a.type === 'A1').sort((a, b) => nameOrder.compare(a.name, b.name));
|
|
const end = abutments.filter((a) => a.type === 'A2').sort((a, b) => nameOrder.compare(a.name, b.name));
|
|
const others = abutments.filter((a) => a.type !== 'A1' && a.type !== 'A2');
|
|
return [
|
|
...start.map((a) => ({ kind: 'abut' as const, name: a.name, type: a.type })),
|
|
...piers.map((name) => ({ kind: 'pier' as const, name })),
|
|
...end.map((a) => ({ kind: 'abut' as const, name: a.name, type: a.type })),
|
|
...others.map((a) => ({ kind: 'abut' as const, name: a.name, type: a.type })),
|
|
];
|
|
}
|