
    jC;                       d Z ddlmZ ddlZddlmZmZmZ  ej                  dej                         ej                  dej                         ej                  dej                  ej                  z        gZ ej                  dej                        Z ej                  d	ej                        Zdd
ZddZddZddZddZddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZddddej.                  d	 	 	 	 	 	 	 	 	 	 	 ddZy)u  Şekli eksiklik tarayıcısının deterministik (LLM'siz) kuralları.

Her kural, başvuru metinlerini regex/string analiziyle inceler ve sıfır
veya daha fazla `Finding` döndürür. LLM gerektirmez — ücretsiz, anında ve
%100 tekrarlanabilir.

Kurallar TürkPatent Patent Başvuru Kılavuzu ve 6769 sayılı SMK
Yönetmeliği'ne dayanır. Kural kimlikleri (rule_id) kararlıdır; UI ve
testler bunlara güvenir.
    )annotationsN)FindingJurisdictionSeverityu   ba[ğg]ı?ms[ıi]z\s+istemu   ba[ğg]ı?ml[ıi]\s+istemu@   ^\s*(y[öo]ntem|sistem|[üu]r[üu]n|aparat|kullan[ıi]m)\s+istemz^\s*(\d+)\s*[.)]\s+u%   [İIi]stem\s+\d+\s+(ila|ile|ve)\s+\d+c                p    t        j                  dd| xs d      j                         j                         S )uH   Metni karşılaştırma için sadeleştirir: küçük harf, tek boşluk.z\s+  )resubstriplower)texts    -/tmp/py-stage/app/services/formality/rules.py_normr   (   s+    66&#tzr*00288::    c                    g }t         D ]o  }|j                  | xs d      }|s|j                  d      j                         }|j	                  t        dt        j                  dddd| d|d	
              |S  |S )u5   İstemler bölümünde alt başlık kullanılmamalı.r	   r   zclaims.no_subheadingsistemleru'   İstemlerde alt başlık kullanılmışu   İstemler; bağımsız, bağımlı, yöntem veya sistem istemi gibi alt başlıklar altında gruplanamaz. İstemler 1'den başlayarak kesintisiz numaralandırılmalıdır."uv   " gibi alt başlıkları kaldırın; istem metinlerini olduğu gibi bırakıp yalnızca başlık satırlarını silin.3   TürkPatent Patent Başvuru Kılavuzu — İstemlerrule_idseveritysectiontitledetail
suggestionexcerptlegal_basis)_SUBHEADING_PATTERNSsearchgroupr   appendr   r   ERROR)claimsfindingspatmlines        r   check_claims_subheadingsr)   1   s     H# JJv|$771:##%DOO3%^^&CL
 TF #0 0 ! U!( O32 Or   c                   t         j                  | xs d      D cg c]  }t        |j                  d             }}|s!t	        dt
        j                  ddddd	      gS g }|d
   dk7  r6|j                  t	        dt
        j                  ddd|d
    ddd	             t        ||dd d      D ]L  \  }}||dz   k7  s|j                  t	        dt
        j                  ddd| d| d|dz    ddd	              |S  |S c c}w )uA   İstemler 1, 2, 3 ... şeklinde kesintisiz numaralandırılmalı.r	      zclaims.no_numbered_claimsr   u   Numaralı istem bulunamadıuZ   İstemler bölümünde '1.', '2.' biçiminde numaralandırılmış istem tespit edilemedi.u7   Her istemi sıra numarasıyla (1., 2., ...) başlatın.r   r   r   r   r   r   r   r   r   zclaims.numbering_startu,   İstem numaralandırması 1'den başlamıyoru   İlk istem u$    numarasıyla başlıyor; 1 olmalı.u?   İstemleri 1'den başlayacak şekilde yeniden numaralandırın.NF)strictzclaims.numbering_gapu'   İstem numaralandırmasında atlama var   İstem z'den sonra z
 geliyor; z
 beklenir.u6   İstemleri kesintisiz (1, 2, 3, ...) numaralandırın.)
_CLAIM_STARTfinditerintr!   r   r   WARNINGr"   r#   zip)r$   r'   numsr%   prevcurs         r   check_claims_numberingr7   P   sE   %1%:%:6<R%HIC
OIDI3!))"3. UQ
 	
 !HAw!|0!"D$T!WI-QR\Q
	
 tABx6 	c$(?OO2%^^&C!${3%z!8*J0  X U O#" Oa Js   !Dc                    t         j                  | xs d      }|sg S t        dt        j                  ddd|j                  d       dd|j                  d      d	
      gS )uK   Çoklu bağımlı istemlerde 'İstem 1 ila 3' gibi biçimler kabul edilmez.r	   zclaims.bad_multi_dependencyr   u'   Hatalı çoklu bağımlı istem ifadesir   r   uv   " biçimi kabul edilmez. Çoklu bağımlı istemler alternatif yolla gönderme yapmalıdır (örn. 'İstem 1 veya 2').uO   'ila', 'ile', 've' yerine 'veya' kullanın (örn. 'İstem 3 veya 4'teki gibi').u;   TürkPatent Patent Başvuru Kılavuzu — İstemler sf. 8-9r   )_BAD_MULTI_DEPr    r   r   r2   r!   )r$   r'   s     r   check_claims_multi_dependencyr:      sp    fl+A	1%%;QWWQZL !- -
7 GGAJU	
 r   c                0   | xs dj                         sg S t        t        j                  |             }|sg S g }t	        |      D ]  \  }}|j                         }|dz   t        |      k  r||dz      j                         n
t        |       }| || j                         }|j                  d      r|dd n|}t        j                  d|      }	|	s|j                  t        dt        j                  dd	|j                  d       d
ddd              |S )u!  Her istem tek cümle olmalı; sonda yalnızca bir nokta bulunmalı.

    Basit sezgisel: bir istem bloğunun içinde (sondaki nokta hariç) cümle
    sonu noktası varsa uyarı verilir. Kısaltmalar (No., vb.) yanlış pozitif
    üretebileceğinden bu kural WARNING seviyesindedir.
    r	   r+   .Nz(?<!\d)\.(?:\s|$)zclaims.multi_sentencer   r.   u    birden fazla cümle içeriyoru   Her istem tek cümle olarak yazılmalı; nokta yalnızca istemin sonunda bir kez kullanılmalıdır. Gerekli yerde virgül veya noktalı virgül kullanın.ud   İstem içindeki cümle sonu noktalarını ';' ile değiştirip istemi tek cümleye dönüştürün.u,   TürkPatent Patent Başvuru Kılavuzu sf. 11r,   )r   listr/   r0   	enumerateendlenstartendswithr
   r    r"   r   r   r2   r!   )
r$   startsr%   ir'   beginr@   bodycoreinners
             r   check_claims_single_sentencerJ      s    Lb!	,''/0F	 H&! 1'(1us6{':fQUm!!#FeC &&( MM#.tCRyD		.5OO3%--&#AGGAJ</MNC
L !O6 Or   c           
         |xs dj                         sg S t        |       }t        |      }|r||v rg S t        dt        j                  dddd|j                          dd	      gS )
u9   Özet başlığı altına buluş başlığı yazılmalı.r	   zabstract.missing_titleozetu   Özette buluş başlığı yoku   Özet sayfasının başına 'ÖZET' ifadesinin altına, başvuru formu ve tarifnamedeki ile aynı buluş başlığı yazılmalıdır.u8   Özet metninin başına buluş başlığını ekleyin: "r   u6   TürkPatent Patent Başvuru Kılavuzu — Özet sf. 14r,   )r   r   r   r   r#   )abstractinvention_titlenorm_abs
norm_titles       r   check_abstract_has_titlerQ      s    !r((*	XH'JjH,	,^^2W$**,-R1 Q	
 r   c           
         t        t        j                  d| xs d            }|dk  rg S t        dt        j
                  dd| dd| d	d
|dz
   dd      gS )u4   Özet, yönetmelik gereği ~150 kelimeyi aşmamalı.z\S+r	      zabstract.too_longrL   u   Özet çok uzun (z kelime)u4   Özet en fazla 150 kelime olmalıdır. Mevcut özet u    kelime içeriyor.u   Özeti yaklaşık u    kelime kısaltın.u   SMK Yönetmeliği — Özetr,   )rA   r
   findallr   r   r2   )rM   wordss     r   check_abstract_lengthrV      sz    

68>r23E|	'%%%eWH5F'+- ,ECK=8KL5	
 r   c                D   g }d| dfd|dfd|dfg}|D ]  \  }}}|xs dj                         st        |      dd	 }|j                         |vs=|j                  t	        | d
t
        j                  |d| d|j                          d| dd| dd              |S )u5   Başvuru unsurları doğru başlıklarla başlamalı.	tarifnameu
   TARİFNAMEr   u	   İSTEMLERrL   u   ÖZETr	   Nx   z.missing_heading'u   ' başlığı görünmüyorz	 unsuru 'u!   ' başlığıyla başlamalıdır.u   Metnin en başına 'u   ' başlığını ekleyin.%   TürkPatent Patent Başvuru Kılavuzur,   )r   r   r   r"   r   r   r2   
capitalize)	descriptionr$   rM   r%   checksr   r   expectedheads	            r   check_section_headingsra     s     !H	k<0	V[)	7#F
 $* x
!!#T{4C >>4'OO&i'78%--#hZ'BC"--/0	( D+ + "6hZ?XY G& Or   c                b   | xs dj                         sg S g }t        |       }d|fd|ffD ]  \  }}|xs dj                         s|t        |      vs)|j                  t        | dt        j
                  |d| dd|j                          d| j                          d	d
              |S )u6   Buluş başlığı tarifname ve özette aynı olmalı.r	   rX   rL   z.title_mismatchu   Buluş başlığı u    içinde bulunamadıuS   Buluş başlığı; başvuru formu, tarifname ve özette birebir aynı olmalıdır.u"    içindeki buluş başlığını "u   " ile eşleştirin.r[   r,   )r   r   r"   r   r   INFOr\   )rN   r]   rM   r%   rP   r   r   s          r   check_title_consistencyrd   #  s     !r((*	 H'J&4vx6HI 
!!#U4[(OO&i7%]]#/y8LM5 #--/0 1,22455IK !H	* Or   r	   )r]   r$   rM   rN   jurisdictionc                   g }|t        |      z  }|t        |      z  }|t        |      z  }|t        |      z  }|t        j
                  k(  r?|t        |      z  }|t        ||      z  }|t        | ||      z  }|t        || |      z  }|S |t        j                  k(  rddlm} | || ||      z  }|S |t        j                  k(  rddlm} | || ||      z  }|S )u  Deterministik kuralları çalıştırır ve bulguları birleştirir.

    Ofise (jurisdiction) göre kural seti seçilir:
    - Ortak kurallar (istem numaralandırma, çoklu bağımlılık, tek cümle,
      özet uzunluğu) her ofiste geçerlidir.
    - TR-özel kurallar (Türkçe bölüm başlıkları, özette buluş başlığı,
      başlık tutarlılığı) yalnızca TürkPatent başvurularında çalışır.
    - EP/US-özel kurallar ilgili modüllerden gelir (epo.py, uspto.py).
    r   )check_epo_rules)r]   r$   rM   )check_uspto_rules)r)   r7   r:   rJ   r   TRrV   rQ   ra   rd   EPapp.services.formality.eporg   USapp.services.formality.usptorh   )r]   r$   rM   rN   re   r%   rg   rh   s           r   run_deterministic_checksrn   G  s   " !H (00H&v..H-f55H,V44H |&)(33,XGG*;II+O[(SS O 
	(>O#FX
 	
 O 
	(B%#FX
 	
 Or   )r   strreturnro   )r$   ro   rp   list[Finding])rM   ro   rN   ro   rp   rq   )rM   ro   rp   rq   )r]   ro   r$   ro   rM   ro   rp   rq   )rN   ro   r]   ro   rM   ro   rp   rq   )r]   ro   r$   ro   rM   ro   rN   ro   re   r   rp   rq   )__doc__
__future__r   r
   app.services.formality.modelsr   r   r   compile
IGNORECASE	MULTILINEr   r/   r9   r   r)   r7   r:   rJ   rQ   rV   ra   rd   ri   rn    r   r   <module>ry      sf  	 # 	 I I BJJ,bmm<BJJ+R]];BJJR}}r||+-  rzz0",,?
 ,bmm
;>2j4)`62!-0@'*69L !-00 0 	0
 0 0 0r   