공급 라인 · 오프라인
템플릿의 노드 하나하나가 쪽의 틀(slide master)인지 그 쪽의 내용(foreground)인지를 가르는 규칙 엔진. 네트워크 호출도 외부 의존도 없는 순수 계산이고, 판단의 근거는 하나다 — 여러 쪽에 걸쳐 같은 자리에 되풀이되는가.
json_
원본 → ALSC top level
build
어댑터 — 엔진 밖
review()
판정 엔진
to
칸 맞추기
build
6-ALSC 조립
parseAsStructuredContent 이고 BE 밖이다. ML 노드별 예측은 buildSlideTemplate 으로 함께 들어간다.extractLayout 이 아니라 computeTemplate 이다review() 의 판정 단위가 템플릿이고 최소 세 장이 필요한데,
extractLayout 은 쪽 하나만 보므로 거기서는 부를 수가 없다.
이 제약이 엔진 설계 전체를 결정한다 — 되풀이를 근거로 삼는 이상 여러 쪽을 동시에 들고 있어야 한다.
buildSlideTemplate 은 nodeType 처럼
ALSC 에 없는 칸을 채우는 것이 일이다. 안 채우면 예외가 나지 않고
판정이 조용히 달라진다 — 규칙 여섯 곳이 그 값을 읽기 때문이다.
width·height 도 같은 처지로, jsd 루트에서 와야 한다.
SlideTemplate
nodeType · 글 · 글꼴 · 자원 키page_title 만 판정에 쓴다노드마다 판정 하나
규칙이 아무 말도 안 한 노드는 foreground 로 채운다.
그렇게 하지 않으면 buildLayeredAlscFromIds 가 노드마다 경고를 찍는다.
«모름»이라는 출력은 없다는 것이 이 계약의 성격이다.
입출력 계약 원문은
docs/rat-pod/background-extractor/02-schema.md, 개요는 같은 폴더 00-overview.md.
쪽 하나만 보고는 틀인지 내용인지 가릴 수 없다. 쪽 위쪽의 작은 글자는 머리말일 수도 있고 본문 소제목일 수도 있다. 가르는 것은 여러 쪽에 걸쳐 같은 자리에 되풀이되는가이다.
이 생각이 네 국면으로 펼쳐진다. 전체 마스터의 97%가 네 가장자리 자리에서 나온다.
왜 고정값이 아닌가
큰 글씨를 쓰는 템플릿은 머리말도 두껍기 때문이다. 고정 폭으로 두면 그런 템플릿의 머리말이 띠 밖으로 나간다.
왜 모든 글자의 중앙값이 아닌가
쪽번호처럼 작은 것이 중앙값을 끌어내려 띠가 좁아진다. 그래서 제목 후보만 센다.
왜 기둥이 띠보다 좁은가
띠는 글줄이 쌓이며 행간을 먹지만 기둥은 한 열만 품는다. 같은 자를 쓰면 본문 카드 그리드의 첫 칸이 기둥으로 들어온다.
예전에는 상자 중심으로 쟀는데, 중심만 걸치면 아무리 길어도 들어온 것으로 봤다. 쪽 한복판에서 시작해 띠를 살짝 물고 지나가는 본문 글이 머리말이 됐다. 조건 ②를 가장자리에서 시작하는 것에만 주는 이유는, 가장자리에 붙인 뱃지와 로고가 흔히 띠보다 조금 크기 때문이다.
본문 카드 그리드를 막으려고 좁힌 값이고, 그 탓에 두꺼운 진짜 기둥을 놓친다. 실제로 가르는 것은 폭이 아니라 판이 있느냐다 — 본문 그리드의 첫 칸에는 쪽 높이를 덮는 배경 판이 없고, 왼쪽 목차 열에는 있다. 진짜 기둥의 중심은 0.03~0.05, 본문 그리드 첫 칸은 0.15~0.21 사이다.
제목은 템플릿 성질이다
쪽마다 거의 같은 자리에 같은 모양으로 앉는다. 쪽 하나만 보고 가장 큰 글자를 고르면 본문이 제목을 이긴다.
자리가 아니라 값으로 찾는다
자리가 흔들려도 값이 스스로를 증명하기 때문이다. 어떤 템플릿은 쪽번호가 열두 쪽에서 아래에 있다가 한 쪽에서만 위로 올라간다. 자리로 묶으면 그 쪽을 잃고, 값으로 묶으면 저절로 이어진다.
'01' 도 1 과 같은 값이다값 = 쪽 + 상수 로 떨어지면 쪽번호 수열이다남은 마스터의 80%가 여기서 나온다
| 걸음 | 하는 일 |
|---|---|
| ① 후보 | 띠와 기둥 안의 글자. 제목과 그 주변은 뺀다 |
| ② 묶기 | 윗변·상자 높이·가로 구역이 맞는 것끼리. 쪽 하나에 하나 |
| ②b 거울상 | 좌우를 오가는 자리는 하나로 본다 |
| ③ 과반 | 쪽 과반을 덮는 자리만 남긴다 |
| ④ 채움 | 자리가 섰으면 빠진 쪽을 다시 훑는다 |
| ⑤ 비텍스트 | 같은 자산이 과반에 되풀이되면 로고·아이콘도 머리말이다 |
| ⑦ 구분선 | 제목을 감싼 한 쌍은 제목의 것이다 |
| ⑧ 장식 떼 | 글자 없이 흩어진 도형 떼는 꼬리말이 아니다 |
| ⑧b 한 줄 | 마스터 글자와 같은 줄에 앉은 것도 마스터다 |
| ⑨ 제목 자리 | 어느 쪽에서든 타이틀로 잡힌 자리는 제목 자리다 |
순서를 바꾸면 본문 요소가 만든 자리가 먼저 낚아채서 가장자리 글자를 삼킨다. 실측에서 200 템플릿 중 143 개가 자리를 하나도 못 세웠다.
관문에 걸려 일부러 뺀 것을 사유와 함께 적어 둔다. 자리를 못 세운 것(모름)과 가장자리가 아니라고 판단한 것(거절)은 다르다. 뒤따르는 무리 표결에서 모름은 기권이지만 거절은 전경 표여야 한다 — 어떤 템플릿에서 태그를 떼기만 하고 아무 말도 안 남긴 탓에 스물세 개가 3 대 0 으로 마스터가 된 적이 있다.
1꾸밈 임자 다툼
마스터와 전경이 같은 꾸밈을 서로 제 것이라 할 때
2사진 · 영상 · QR · 사진틀
그 자체가 내용이라 틀이 될 수 없다
3프레임 안과 테두리
프레임과 그 살림살이는 전경이다
4타이틀과 그 주변
전경이다
5남은 가장자리와 쪽번호
마스터다
꾸밈을 제 위에 두는 임자가 진다. 머리말은 선을 제 아래에 두고, 쪽번호는 선과 세로로 겹쳐 옆에 두는데, 제목만 선을 제 위에 둔다. 그래서 제목이 진다.
무리 표결 (AON)
자리는 템플릿 성질인데 임자 경쟁은 쪽마다 돈다. 그래서 같은 물건이 쪽마다 다른 갈래로 간다. 무리로 묶어 표결해서 되돌린다.
전량에서 23,688 개를 마스터로 끌어올리고 전체 템플릿의 27%에 손을 댄다. 되풀이를 근거로 판단하는 이 시스템의 중심축이다.
신원은 쪽이 바뀌어도 안 바뀌는 것이고, 자리는 쪽마다 되풀이되는 것이다. 예전에 둘을 한 열쇠에 넣어 두어서 같은 물건이 크기가 달라지면 갈리고, 다른 물건이 크기가 같으면 붙었다.
| 갈래 | 신원 |
|---|---|
| 자원이 있는 것 | url 또는 shapeKey. SVG 의 85%, 사진의 100% 가 가진다 |
| 선 | 방향과 두께. 길이는 쪽마다 달라도 같은 선이다 |
| 글 | 뼈대(숫자와 공백을 지운 문구) + 글꼴 + 글자 크기 |
| 그 밖 | nodeType |
쪽마다 표식 하나만 색이 바뀌는 템플릿이 있다. 지금 이 쪽을 가리키는 표시인데, 색으로 가르면 그 하나가 무리에서 떨어져 나간다.
자리 판별이 일단 넉넉하게 잡은 뒤, 뒷단계 규칙들이 아닌 것을 걸러낸다.
대부분 내리는 규칙이라는 것이 이 구조의 성격이다.
아래 순서로 돌고, 앞이 내린 것을 뒤가 되올리기도 한다. verdict.ts 가 이 차례의 정본이다.
| 차례 | 규칙 | 뜻 | 판 |
|---|---|---|---|
| 1 | 무리 맞추기 aon | 쪽마다 갈린 무리를 표로 통일한다 | |
| 2 | 쪽 안 갈림 pageaon | 똑같은 것이 한 쪽에 여럿인데 하나만 마스터면 그 쪽에서는 다 전경이다 | |
| — | 자리 흔들림 roamout | ⏸ 파킹 — 파이썬과 갈래를 맞췄다 | v4 |
| 3 | 홀로 선 도형 lone | 글자 짝 없이 혼자 선 도형인데 쪽이 어수선하면 꾸밈이다 | |
| 4 | 구분선 여럿 manyline | 쪽을 가로지르는 긴 선이 한 쪽에 둘 이상이면 쪽 꾸밈이다 | |
| 5 | 세 줄 넘는 글 line3fore | 가로로 세 줄 이상인 글상자는 문단이고, 문단은 내용이다 | |
| 6 | 장 번호 chapmaster | CHAPTER.01 처럼 번호만 느는 글은 쪽번호와 같은 것이다 | |
| 7 | 넘친 기둥 railspill | 기둥을 넘친 마스터가 전경 글자에 위아래로 붙어 있으면 그것도 내용이다 | v2 |
| 8 | 쪽 꾸밈 pagedeco | 고유한 그림이 가장자리에 흩어져 셋 이상이면 그 쪽의 장식이다 | |
| 9 | 무리 닫기 famclose | 무리를 닫는다 | |
| 10 | 쪽 안 무리 inpageaon | 쪽 안에서 무리를 맞춘다 | v2 |
| 11 | 리듬 형제 rhythm | 등간격으로 늘어선 형제는 하나가 강조돼 있어도 한 무리다 — 올리기만 한다 | v4 |
| 12 | 마스터 곁의 그림 artnear | 이미 마스터인 것과 같은 축에 붙어 있고 더 작으면 그 마스터의 꾸밈이다 | |
| 13 | 머리말 위 headtop | 머리말 위에 같은 축으로 더 큰 전경 글자가 있으면 그 머리말은 부제목이다 | v1 |
| 14 | 쪽몰림 pageburst | 한 무리 안에서 한 쪽에만 몰린 식구는 그 쪽의 본문이다 | v1 |
| 15 | 곁 아이콘 sideicon | 마스터 글자 곁에 붙은 작은 아이콘은 그 마스터의 일부다 — 되돌린다 | v4 |
rhythm 은 inpageaon 바로 뒤여야 한다 — 앞에 두면 inpageaon 이 도로 내린다.
sideicon 은 맨 끝이다 — 회수하는 자라 내리는 자들 뒤에 서야 뜻이 있다.
| 단계 | 전경 → 마스터 | 마스터 → 전경 | 닿은 템플릿 |
|---|---|---|---|
| 무리 맞추기 | 23,688 | 6,693 | 3,899 |
| 구분선 여럿 | 0 | 14,306 | 1,535 |
| 쪽 꾸밈 | 0 | 5,202 | 131 |
| 무리 닫기 | 3,937 | 3,125 | 1,943 |
| 쪽 안 갈림 | 0 | 3,910 | 750 |
| 마스터 곁의 그림 | 2,158 | 0 | 203 |
| 장 번호 | 1,023 | 0 | 189 |
| 자리 흔들림 (지금은 파킹) | 0 | 768 | 78 |
| 머리말 위 | 0 | 721 | 83 |
| 세 줄 넘는 글 | 0 | 564 | 108 |
| 홀로 선 도형 | 0 | 207 | 18 |
손대는 범위가 규칙마다 크게 다르다. 무리 맞추기는 3,899 템플릿, 홀로 선 도형은 18 템플릿이다 — 후자는 특정 상황만 겨냥한 좁은 자다.
자리 흔들림 줄은 옛 값이다. v4 에서 파킹으로 되돌렸으므로 지금은 안 돈다 — 위 수치는 켜져 있던 때 잰 것이다.
출처는 docs/rat-pod/background-extractor/01-logic.md.
세 칸이 어긋나서 toClassifications() 가 있다
review() 가 내는 것과 buildLayeredAlscFromIds 가 받는 것이 곧바로 맞물리지 않는다.
호출부마다 손으로 메우면 서로 다르게 메우므로 한 함수에 모았다.
| 칸 | 조립 함수 | Reviewer |
|---|---|---|
| 단위 | 쪽 하나의 배열 | 템플릿 통째 |
elementRole | 롤 버킷 넷을 가른다 | 만들지 않는다 |
reason | 객체 | 한 줄 문자열 |
BE 는 밑줄 꼴(page_title), 조립 함수는 붙임 꼴(pagetitle)을 쓴다. 그 사이도 이 함수가 옮긴다.
고정판 60 장 실측
checkPartition(result, page) 은 조립 함수까지 가서 예외가 나기 전에 어긋남을 잡는다 —
거기까지 가서 터지면 어느 템플릿의 어느 쪽인지 되짚기가 번거롭다.
검증 기준은 사람이 검수 완료를 누르고 한 군데라도 고친 171 장이다(42,666 노드). 씨앗을 그대로 받은 장은 점수가 거저 나오므로 뺀다.
| 갈래 | 정밀 | 재현 | F1 | 맞음 | 놓침 | 헛발 |
|---|---|---|---|---|---|---|
| 마스터 | 0.952 | 0.866 | 0.907 | 5,258 | 811 | 264 |
| 하는 일 | 파일 |
|---|---|
| 모듈 진입 | src/lib/backgroundExtractor/index.ts |
| 판정 엔진 | src/lib/backgroundExtractor/reviewer/review.ts |
| 규칙 차례의 정본 | reviewer/core/verdict.ts |
| 무리 짓기 (가장 큰 모듈) | reviewer/core/families.ts |
| 무리 표결 | reviewer/core/aon.ts |
| 띠 · 기둥 · 판 | reviewer/core/zones.ts |
| 가장자리 아홉 걸음 · 거절 장부 | reviewer/core/headfoot.ts |
| 제목 자리 | reviewer/core/titles.ts |
| 쪽번호 계열 | reviewer/core/numbers.ts |
| 뒤에 서는 규칙 | reviewer/core/rules.ts · headtop.ts · burst.ts |
| 6-ALSC 조립 | src/lib/backgroundExtractor/buildLayeredAlscFromIds.ts |
| 어댑터 (엔진 밖) | src/lib/backgroundExtractor/buildSlideTemplate.ts |
| 배치 오케스트레이션 | src/lib/backgroundExtractor/processBackgroundExtractor.ts · src/workers/background-extractor-worker.ts |
규칙 하나하나의 상세는 소스 주석에 있다 — 그 자를 정하게 만든 실제 템플릿 번호와 측정값이 함께 적혀 있으므로,
규칙을 고칠 때는 소스를 먼저 읽는 편이 빠르다.
설명 문서는 docs/rat-pod/background-extractor/ 여덟 편이고,
이 페이지의 수치는 그중 00-overview.md · 01-logic.md · 02-schema.md 에서 왔다.