
    i9                     j   d Z ddlZddlmZ  ee      j                         j                  j                  dz  dz  dz  ZdefdZ	 e	       Z
e
d	   d
   Ze
d   d   Z ee
d   d         Ze
d   d   Ze
d   d   Ze
d   d   ZddddddddddddddddZdededz  fdZdefdZdededeeef   fdZdee   fdZdefdZdefd Zdefd!Zed"k(  rddl Z  e!e jD                        d#kD  re jD                  d#   d$k(  r e#d% e        d& e                e#d'e d(        e#d)e d        e#d*e         e#         e       jI                         D ]"  \  Z%Z& e#d+e% d,e&d-    d.e&d/    d0e&d1           $  e#         e#d2        e       D ]  Z' e#d3e'         y e#d4        e#d5       yy)6u  DQ (Design Quality) 규칙 단일 소스 모듈.

모든 디자인 품질 규칙은 memory/specs/dq-rules.json에서 로드.
이 모듈을 통해서만 DQ 규칙에 접근할 것.

사용법:
    from dq_rules import DQ_RULES, get_font_rule, check_font_size, validate_font_sizes

    # 규칙 직접 접근
    headline_min = DQ_RULES["font_sizes"]["headline"]["min"]  # 84

    # 역할별 폰트 규칙 조회
    rule = get_font_rule("헤드라인")  # {"min_px": 84, "min_weight": 800, ...}

    # 단일 폰트 크기 검증
    ok, msg = check_font_size("헤드라인", 68)  # (False, "헤드라인 최소 84px 위반: 68px")

    # HTML/CSS에서 폰트 크기 전체 검증
    errors = validate_font_sizes(html_content)
    N)Pathmemoryspecszdq-rules.jsonreturnc                  z    t        t        d      5 } t        j                  |       cddd       S # 1 sw Y   yxY w)u%   dq-rules.json에서 규칙을 로드.zutf-8)encodingN)open_RULES_PATHjsonload)fs    ?/home/jay/workspace/.worktrees/task-2116-dev1/tools/dq_rules.py_load_rulesr      s.    	kG	, yy|  s   1:
font_sizesabsolute_minfont_pairingmin_familiesbanned_fonts
dq_scoringpass_thresholdtext_densitymax_elements_per_slidemax_words_per_slidecore_metricheadlinesubheadcta
disclaimer)u   핵심 수치u   핵심수치u   숫자 강조u   헤드라인u   메인 카피u   메인카피u   서브헤드u   서브 카피u   서브카피u   본문CTAr   u   버튼u   면책u   최소rolec                     t         j                  |       }|syt        d   j                  |      }t        d   j                  |      }|r|sy||d   |d   |d   dS )u   역할명으로 폰트 규칙을 조회.

    Returns:
        {"min_px": int, "min_weight": int, "max_weight": int, "key": str} or None
    Nr   font_weightsminmax)keymin_px
min_weight
max_weight)_ROLE_KEY_MAPgetDQ_RULES)r    r%   sizeweights       r   get_font_ruler.   C   sp     

D
!CL!%%c*Dn%))#.Fv u+UmUm	     c                      t               } i }t        j                         D ]T  \  }| v r| j                         t	        |      }|s*t        fdt        j                         D              }|||<   V |S )u   모든 역할의 폰트 규칙을 반환.

    Returns:
        {"헤드라인": {"min_px": 84, ...}, "서브헤드": {...}, ...}
    c              3   4   K   | ]  \  }}|k(  s|  y w)N ).0rkr%   s      r   	<genexpr>z%get_all_font_rules.<locals>.<genexpr>i   s     Itq!SIs   )setr)   itemsaddr.   next)	seen_keysresultr    rulelabelr%   s        @r   get_all_font_rulesr?   Z   sz     IF"((* !	c)cT"I}':':'<IIE F5M! Mr/   pxc                 r    |t         k  rdd| dfS t        |       }|sy||d   k  rd|  d|d    d| dfS y)	uk   단일 폰트 크기를 역할 기준으로 검증.

    Returns:
        (passed: bool, message: str)
    Fu"   40px 미만 절대 금지 위반: r@   )Tu   OK (역할 미식별)r&   u    최소 u   px 위반: )TOK)ABSOLUTE_MIN_PXr.   )r    r@   r=   s      r   check_font_sizerD   n   sc     
O:2$bAAAD,	DNhtH~&6k"RHHHr/   c                      t         d   d   S )u/   DQ 평가 시 자동 FAIL 규칙 목록 반환.r   auto_fail_rulesr+   r2   r/   r   get_auto_fail_rulesrH      s    L!"344r/   c                      t         d   d   S )u   DQ 10항목 정보 반환.r   r8   rG   r2   r/   r   get_dq_itemsrJ      s    L!'**r/   c                      t         d   d   S )u   현재 규칙 버전 반환._metaversionrG   r2   r/   r   rules_versionrN      s    GY''r/   c                       t        t              S )u   규칙 파일 경로 반환.)strr
   r2   r/   r   
rules_pathrQ      s    {r/   __main__   summaryz
DQ Rules vu    — u   PASS 기준: u   점+u   절대 최소: u   폰트 최소 종류: z  z: r&   zpx+, weight r'   -r(   u   자동 FAIL 규칙:z  - u&   사용법: python3 dq_rules.py summaryzD       from dq_rules import DQ_RULES, get_font_rule, check_font_size)(__doc__r   pathlibr   __file__resolveparentr
   dictr   r+   rC   MIN_FONT_FAMILIESr7   BANNED_FONTSPASS_THRESHOLDMAX_ELEMENTS_PER_SLIDEMAX_WORDS_PER_SLIDEr)   rP   r.   r?   inttupleboolrD   listrH   rJ   rN   rQ   __name__syslenargvprintr8   r    r=   r4   r2   r/   r   <module>rj      s  *   8n$$&--44x?'IO[T  = <(8^,^< 8N+N;<,'(89!.12JK ~./DE  #!"& t .D (# 3 5s+; (5T#Y 5
+d +
(s (
C  z
388}qSXXa[I5
=?+5?@n-T23034&'8&9:;,.446 	fJD$BtfBtH~.l4;M:NaPTUaPbOcde	f#$$& 	AD*	 	67TU# r/   