
    HR-e                     X   d dl Z d dlZd dlZd dlmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZmZmZ ddgZe                    d	d
          Ze                    dd          ZdZdez  ZdZdZ ee          ZdZ G d d          Z e            Z G d de          Z d Z!d Z"d Z#d Z$dS )    N)AstropyUserWarning   )conf)_is_int_str_to_num_words_group	translate)VerifyErrorVerifyWarning_ErrList_VerifyCard	UndefineddeDEdDeEP       z= =c                       e Zd ZdZd ZdS )r   zUndefined value.c                     d S N selfs    4lib/python3.11/site-packages/astropy/io/fits/card.py__init__zUndefined.__init__!   s        N)__name__
__module____qualname____doc__r   r   r    r   r   r      s)            r    c                   4   e Zd ZeZ	  ej        dez            Z ej        dej	                  Z
dZdZdez   Zdez   Z ej        de d          Z ej        d	e d          Zd
ZdZ ej        de de d          Z ej        d          Z ej        de dez   dz   ez   dz   ez   dz             Z ej        de dez   dz   ez   dz   ez   de dz             ZdZedz   Ze de dZd                    ee          Zde dZde dZ ej        edz             Z ej        d                     ee                    Z ej        e          Z h d!Z!e!"                    d"g          Z#e$Z%dLd$Z&d% Z'd& Z(d' Z)d( Z*e+d)             Z,e,j-        d*             Z,e+d+             Z.e.j-        d,             Z.e.j/        d-             Z.e+d.             Z0e+d/             Z1e+d0             Z2e2j-        d1             Z2e2j/        d2             Z2e+d3             Z3e3j-        d4             Z3e3j/        d5             Z3e+d6             Z4e+d7             Z5e6d8             Z7e6d9             Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?dA Z@dB ZAdC ZBdD ZCdE ZDdF ZEdG ZFdH ZGdMdJZHdK ZId#S )Nr   z^[A-Z0-9_-]{0,%d}$z"^(?:HIERARCH +)?(?:^[ -<>-~]+ ?)+$z"(\.\d+|\d+(\.\d*)?)([DE][+-]?\d+)?z*(\.\d+|\d+(\.\d*)?) *([deDE] *[+-]? *\d+)?z[+-]?z[+-]? *z(?P<sign>[+-])?0*?(?P<digt>)z(?P<sign>[+-])? *0*?(?P<digt>z)\'(?P<strg>([ -~]+?|\'\'|) *?)\'(?=$|/| )z.(?P<comm_field>(?P<sepr>/ *)(?P<comm>(.|\n)*))(z)? *z?$z[ -~]*\Zz(?P<valu_field> *(?P<valu>z|(?P<bool>[FT])|(?P<numr>z)|(?P<cplx>\( *(?P<real>z) *, *(?P<imag>z@) *\)))? *)(?P<comm_field>(?P<sepr>/ *)(?P<comm>[!-~][ -~]*)?)?$z) *\)))? *)z[a-zA-Z_]\w*z(\.\d+)?z(\.z)*z(?P<keyword>{}): +(?P<val>{})z\'(?P<rawval>z)\'z *z *(/ *(?P<comm>[ -~]*))?$$z)(?P<keyword>{})\.(?P<field_specifier>{})$>    ENDCOMMENTHISTORYCONTINUENc                 B   |d|v r|d         }d | _         d | _        d | _        d | _        d | _        d| _        d| _        d| _        d | _        d | _	        d | _
        |||                     ||          s||| _        ||| _        ||| _        d| _        d| _        d S )NkeyTF)_keyword_value_comment_valuestring_image	_verified	_hierarch_invalid_field_specifier_rawkeyword	_rawvalue_check_if_rvkckeywordvaluecomment	_modified_valuemodified)r   r<   r=   r>   kwargss        r   r   zCard.__init__   s    ?uUmG 
    $   !##GU33 "
 "& "
"DL#r    c                 D    t          | j        | j        | j        f          S r   )reprr<   r=   r>   r   s    r   __repr__zCard.__repr__   s    T\4:t|<===r    c                     | j         S r   )imager   s    r   __str__zCard.__str__   s
    zr    c                     dS )N   r   r   s    r   __len__zCard.__len__   s    qr    c                 6    | j         | j        | j        f|         S r   )r<   r=   r>   )r   indexs     r   __getitem__zCard.__getitem__   s    dj$,7>>r    c                 ~    | j         | j         S | j        r |                                 | _         | j         S d| _        dS )z4Returns the keyword name parsed from the card image.Nr)   )r0   r4   _parse_keywordr<   r   s    r   r<   zCard.keyword   sE     =$= [ 	 //11DM= DL2r    c                    | j         t          d          t          |t                    r|                                }|                                }t          |          t          k    r2| j        	                    |          r|dk    rt          d          |}n| j        	                    |          rld| _        t          | _        |dd         dk    r|dd                                         }nAt!          j        d                    |          t&                     nt          d	|d
          || _         d| _        dS t          d|d          )z6Set the key attribute; once set it cannot be modified.Nz.Once set, the Card keyword may not be modifiedr*   zKeyword 'END' not allowed.T	   	HIERARCH zKeyword name {!r} is greater than 8 characters or contains characters not allowed by the FITS standard; a HIERARCH card will be created.zIllegal keyword name: .zKeyword name z is not a string.)r0   AttributeError
isinstancestrrstripupperlenKEYWORD_LENGTH_keywd_FSC_REmatch
ValueError_keywd_hierarch_REr6   HIERARCH_VALUE_INDICATOR_value_indicatorstripwarningswarnformatr   r?   )r   r<   keyword_uppers      r   r<   zCard.keyword   sn    =$ !QRRR%% ,	K nn&&G#MMOOM7||~--$2D2J2J3 3-
 !E))$%ABBB'(..w77 H "&(@% !$33 &abbk//11GG MEEKVG__%	    !!F'!F!F!FGGG#DM!DNNNIWIIIJJJr    c                 ^   | j         rt          | j                  S | j        | j        }nM| j        | j        r|                                 x}| _        n#| j        dk    r
dx| _        }nt          x| _        }t          j	        r)t          |t                    r|                                }|S )z:The value associated with the keyword stored in this card.Nr)   )field_specifierfloatr1   r3   r4   _parse_valuer0   	UNDEFINEDr   strip_header_whitespacerU   rV   rW   )r   r=   s     r   r=   z
Card.value  s      	&%%%;"KEE*dk*"&"3"3"5"55EDKK}""&((ee&//e' 	#Juc,B,B 	#LLNNEr    c                 v   | j         rt          d          |t          }	 | j        }n# t          $ r
 | j        }Y nw xY w|t          }t          |t          t          t          t          t          t          t          j        t          j        t          j        t          j        f
          st          d|d          t          |t          t          j        f          r;t          j        |          st          j        |          rt          d|d          t          |t                    r?| j                            |          }|s"t          d                    |                    n)t          |t          j                  rt          |          }t0          j        rUt          |t                    r@t          |t                    r+|                                |                                k    }nSt          |t                    st          |t                    r||u}n$||k    pt          |t7          |                     }|rl|| _        d | _        d| _        d | _        d| _        | j         rD	 tC          | j                  | _        d S # t          $ r t          d| j         d	          w xY wd S d S )
NziThe value of invalid/unparsable cards cannot set.  Either delete this card from the header or replace it.zIllegal value: rS   zFloating point z( values are not allowed in FITS headers.zFITS header values must contain standard printable ASCII characters; {!r} contains characters not representable in ASCII or non-printable characters.Tzvalue z is not a float)"r7   r]   rj   r=   r
   r1   rU   rV   intrh   complexboolr   npfloatingintegercomplexfloatingbool_float32isnanisinf_ascii_text_rer\   rd   r   rk   rW   typer:   r?   r3   r@   rg   _int_or_float)r   r=   oldvaluem	differents        r   r=   z
Card.value1  s   = 	B  
 =E	#zHH 	# 	# 	# {HHH	#
  H
"
 
 	; 9u999:::eeRZ011 	 HUOO	 !x	 
 S%SSS   s## 		 #))%00A  99?   rx(( 	 KKE' 	Sx%%	S*4UC*@*@	S !))U\\^^;II$'' 	S:eT+B+B 	S -II E)RE4>>1R1R-RI 
	LDK!DN!DN $D"&D# LL"/"<"<DKKK! L L L$%Jdk%J%J%JKKKL
	L 
	LL Ls   ) ==6J #J4c                 l    | j         rt          d          | j        s	d| _        d S t	          d          )NzmThe value of invalid/unparsable cards cannot deleted.  Either delete this card from the header or replace it.r)   z9Values cannot be deleted from record-valued keyword cards)r7   r]   rg   r=   rT   r   s    r   r=   z
Card.value  sQ    = 	I  
 # 	DJJJ K  r    c                     | j         | j         S | j        -| j                            dd          d         | _         | j         S | j        S )zOn record-valued keyword cards this is the name of the standard <= 8
        character FITS keyword that this RVKC is stored in.  Otherwise it is
        the card's normal keyword.
        NrS   r   r   )r9   rg   r<   splitr   s    r   
rawkeywordzCard.rawkeyword  sO     '##!-#|11#q99!<D##<r    c                 t    | j         | j         S | j        | j         d| j         | _         | j         S | j        S )zOn record-valued keyword cards this is the raw string value in
        the ``<field-specifier>: <value>`` format stored in the card in order
        to represent a RVKC.  Otherwise it is the card's normal value.
        N: )r:   rg   r=   r   s    r   rawvaluezCard.rawvalue  sG     >%>!!- $ 4DD
DDDN>!:r    c                 ~    | j         | j         S | j        r |                                 | _         | j         S d| _         dS )zAGet the comment attribute from the card image if not already set.Nr)   )r2   r4   _parse_commentr   s    r   r>   zCard.comment  sE     =$= [ 	 //11DM= DM2r    c                 6   | j         rt          d          |d}t          |t                    r/| j                            |          }|st          d|d          	 | j        }n# t          $ r
 | j        }Y nw xY w|d}||k    r|| _        d| _	        d S d S )NzkThe comment of invalid/unparsable cards cannot set.  Either delete this card from the header or replace it.r)   zGFITS header comments must contain standard printable ASCII characters; zL contains characters not representable in ASCII or non-printable characters.T)
r7   r]   rU   rV   rx   r\   r>   r
   r2   r?   )r   r>   r|   
oldcomments       r   r>   zCard.comment  s    = 	B  
 ?Ggs## 	#))'22A  J)0J J J  	'JJ 	' 	' 	' JJJ	'
 Jj  #DM!DNNN ! s    A( (A<;A<c                 @    | j         rt          d          d| _        d S )NzoThe comment of invalid/unparsable cards cannot deleted.  Either delete this card from the header or replace it.r)   )r7   r]   r>   r   s    r   r>   zCard.comment  s1    = 	I  
 r    c                 "    | j         r| j        S dS )zl
        The field-specifier of record-valued keyword cards; always `None` on
        normal cards.
        N)r<   r8   r   s    r   rg   zCard.field_specifier  s     < 	((4r    c                    |st          d          | j        st          d          || j        k    rM|| _        | j                            dd          d         }d                    ||g          | _        d| _        d S d S )NzDThe field-specifier may not be blank in record-valued keyword cards.z^Cannot coerce cards to be record-valued keyword cards by setting the field_specifier attributerS   r   r   T)r]   rg   rT   r8   r0   r   joinr?   )r   rg   r<   s      r   rg   zCard.field_specifier  s     	"V   % 
	" 8    444$3D!m))#q11!4GHHg%?@@DM!DNNN 54r    c                      t          d          )NzRThe field_specifier attribute may not be deleted from record-valued keyword cards.)rT   r   s    r   rg   zCard.field_specifier  s    8
 
 	
r    c                     | j         r| j        s|                     d           | j         | j        r|                                 | _         | j         S )z
        The card "image", that is, the 80 byte character string that represents
        this card in an actual FITS header.
        zfix+warn)r4   r5   verifyr?   _format_imager   s    r   rF   z
Card.image	  sS     ; 	$t~ 	$KK
###;$.,,..DK{r    c                     | j         s| j        t          k    S | j         o)t	          | j        t                    o| j         o| j         S )z
        `True` if the card is completely blank--that is, it has no keyword,
        value, or comment.  It appears in the header as 80 spaces.

        Returns `False` otherwise.
        )r5   r4   
BLANK_CARDr<   rU   r=   rV   r>   r   s    r   is_blankzCard.is_blank  sV     ~ 	- ;*,,  !DJ,,?TZ!L 	
r    c                      |             }t          |t                    r|                    d          }t          |          |_        d|_        |S )z
        Construct a `Card` object from a (raw) string. It will pad the string
        if it is not the length of a card image (80 columns).  If the card
        image is longer than 80 columns, assume it contains ``CONTINUE``
        card(s).
        latin1F)rU   bytesdecode_padr4   r5   )clsrF   cards      r   
fromstringzCard.fromstring+  sM     suueU## 	+
 LL**E5kkr    c                 r   t          |          t          k    r| j                            |          r|S | j                            |          }|rad                    |                    d                                                                          |                    d          f          S t          |          dk    rN|dd                                         dk    r.|dd                                                                         S |                                                                S )a_  
        `classmethod` to convert a keyword value that may contain a
        field-specifier to uppercase.  The effect is to raise the key to
        uppercase and leave the field specifier in its original case.

        Parameters
        ----------
        keyword : or str
            A keyword value or a ``keyword.field-specifier`` value
        rS   r<   rg   rQ   NrR   )	rY   rZ   r[   r\   _rvkc_keyword_name_REr   groupra   rX   )r   r<   r\   s      r   normalize_keywordzCard.normalize_keyword?  s    w<<>))c.?.E.Eg.N.N)N )//88 	+88Y''--//5577EV9W9WX   \\A'"1"+"3"3"5"5"D"D 122;$$&&,,... ==??((***r    c                    t           j        sdS t          |          dk    r
 | j        | S t          |          dk    rC|\  }}t	          |t
                    sdS || j        v rdS | j                            |          }|r\t	          |t          t          f          r@|                     |                    d          |                    d          d|           dS t	          |t
                    r|                    d          d	k    rz| j                            |          }|r`| j                            |          rH|                     ||                    d          ||                    d
                     dS dS dS dS dS dS )a   
        Determine whether or not the card is a record-valued keyword card.

        If one argument is given, that argument is treated as a full card image
        and parsed as such.  If two arguments are given, the first is treated
        as the card keyword (including the field-specifier if the card is
        intended as a RVKC), and the second as the card value OR the first value
        can be the base keyword, and the second value the 'field-specifier:
        value' string.

        If the check passes the ._keyword, ._value, and .field_specifier
        keywords are set.

        Examples
        --------
        ::

            self._check_if_rvkc('DP1', 'AXIS.1: 2')
            self._check_if_rvkc('DP1.AXIS.1', 2)
            self._check_if_rvkc('DP1     = AXIS.1: 2')
        Fr      r<   rg   NTr   r   val)r   "enable_record_valued_keyword_cardsrY   _check_if_rvkc_imagerU   rV   _commentary_keywordsr   r\   rm   rh   
_init_rvkcr   find_rvkc_field_specifier_val_REr[   )r   argsr<   r=   r\   s        r   r;   zCard._check_if_rvkc`  s   , 6 	5t99>>,4,d33YY!^^!NGUgs++ u$333u.44W==E EC<88 KK	**EKK8I,J,JDRW   t %%%  %**T*:*:Q*>*>9??FF  T/55g>>  OOY!7!7E@R@R    4+ ^   *>*>       r    c                 (   t          |          dk    rM|d         }|                    t                    }|dk     s|dk    rdS |d|         }||t          z   d         }n|\  }}|                                }|r%|d         dk    s|                    d          dk     rdS | j                            |          }|rS|                     ||                    d	          |                    d
          |                    d                     dS dS )a(  
        Implements `Card._check_if_rvkc` for the case of an unparsed card
        image.  If given one argument this is the full intact image.  If given
        two arguments the card has already been split between keyword and
        value+comment at the standard value indicator '= '.
        r   r   rQ   FN'r   r   r<   rawvalr   T)	rY   r   VALUE_INDICATORVALUE_INDICATOR_LENlstrip_rvkc_keyword_val_comm_REr\   r   r   )r   r   rF   eq_idxr<   restr\   s          r   r   zCard._check_if_rvkc_image  s"    t99>>GEZZ00FzzVaZZuGVGnG"55778DD MGT{{}}  	tAw#~~41)<)<5.44T:: 	OOI&&H%%E""	   4	 	r    c                     |                                 }d                    ||f          | _        || _        || _        t          |          | _        || _        dS )z
        Sort of addendum to Card.__init__ to set the appropriate internal
        attributes if the card was determined to be a RVKC.
        rS   N)rX   r   r0   r9   r8   rz   r1   r:   )r   r<   rg   fieldr=   re   s         r   r   zCard._init_rvkc  sS    
  -!ABB( /#E**r    c                    | j         d t                                                   }|                                }|| j        v r|S |dk    rt| j         d         dk    rct
          | j         v rUd| _        t
          | _        | j                             t
          d          d         dd          }|                                S | j         	                    t                    }d|cxk    rt          k    rXn nU|t          k     r|d |         }|d |         }| j         |t          z   d          }|                     ||          r| j        S |S t          j        d                    | j                   t"                     d| _        |S )	NHIERARCHr   r   Tr   r   rQ   z^The following header keyword is invalid or follows an unrecognized non-standard convention:
{})r4   rZ   ra   rX   _special_keywordsr_   r6   r`   r   r   r   r   r   r0   rb   rc   rd   r   r7   )r   r<   re   val_ind_idxr   s        r   rO   zCard._parse_keyword  s   +o~o.4466D222  Z''A#%%(DK77
 "DN$<D!k''(@!DDQGKG==??"+**?;;KK1111>11111 //%l{l3G$1,;,$?M{;1D#D#F#FG
 ,,Wd;; )=($$@@Ft{@S@S&  
 !%r    c                    | j                                         | j        v s| j        r&| j        t
          d                                         S |                     | j                  r| j        S | j	        
                    |                                 d                   }|t          d| j          d          |                    d          |                    d          dk    }n:|                    d          +t          j        dd	|                    d                    }n|                    d
          | j        
                    |                    d
                    }t#          |                    d          t$          d          }|                    d          d}n|                    d          }t'          ||z             }nN|                    d          1| j        
                    |                    d                    }t#          |                    d          t$          d          }|                    d          d}n|                    d          }t'          ||z             }| j        
                    |                    d                    }	t#          |	                    d          t$          d          }
|	                    d          d}n|	                    d          }|t'          ||
z             dz  z  }nt(          }| j        s|                    d          | _        |S ).Extract the keyword value from the card image.Nr   zUnparsable card (z$), fix it first with .verify('fix').ro   Tstrg''r   numrdigtr   signr)   cplxrealimagy              ?valu)r<   rX   r   r7   r4   rZ   rW   r;   r1   _value_NFSC_REr\   _splitr
   r   resub_number_NFSC_REr	   FIX_FP_TABLE2r   rj   r3   )r   r|   r=   r   r   r   r   rdigtrsignr   idigtisigns               r   ri   zCard._parse_value  s    <4#<<<<;~/66888t{++ 	;%%dkkmmA&6779VDLVVV   776??&GGFOOs*EEWWV__(F4aggfoo66EEWWV__('--aggfoo>>DTZZ//DDDzz&!!)zz&))t,,EEWWV__('--aggfoo>>Ddjj00-EEEzz&!!)

6**..E'--aggfoo>>Ddjj00-EEEzz&!!)

6**[//"44EEE  	0 !Dr    c                    | j         t          j        v s| j        rdS |                                 d         }| j                            |          }d}|=|                    d          r'|                    d                                          }n2d|v r.|	                    dd          d         
                                }|S )r   r)   r   Ncomm/)r<   r   r   r7   r   r   r\   r   rW   r   ra   )r   valuecommentr|   r>   s       r   r   zCard._parse_comment%  s     <444442{{}}Q'%%l33= wwv 3''&//0022L   #((a00399;;Gr    c                    | j         | j         }n| j        }t          | j                   | j        k    r`g }g }d}|                                 D ]}|                                \  }}||}|| j        v r|                    |           <| j        	                    |          }|s||fc S |
                    d          pd}	|	                                }	|	r|	d         dk    r
|	dd         }	|                    |	           |
                    d          }
|
r'|                    |
                                           || j        v rd                    |          }n.dd                    |           dd	                    |           }||fS | j        | j        v r|                    d	d
          \  }}n	 |                    | j                  }n# t$          $ r d}Y nw xY w||dt&                   }|t&          d         }nG|dk    r#|dd         dk    r|dd         }|dd         }n|                    | j        d
          \  }}|                                |                                fS )zT
        Split the card image between the keyword and the rest of the card.
        Nr   r)   &r   r   z' / r   r   
   rQ   rR   r   )r4   rF   rY   length_itersubcardsr   r   append_strg_comment_REr\   r   rW   r   r<   r   r   rL   r`   r]   rZ   ra   )r   rF   valuescommentsr<   r   kwvcr|   r=   r>   r   delim_indexs                r   r   zCard._split=  s    ;" KEEJE t{dk))FHG**,, 6 6B? Gd777MM"%%% )//33 "r6MMM-2 'U2Y#--!#2#JEe$$$''&// 6OOGNN$4$4555$333!wwv  M2776??LL8J8JLLL((<4111$)KKQ$7$7!G\\##kk$*?@@ # # #"#
 "0$^__5r!!eBQBi;&>&>)$QRRy(-D4I1(M(M%}} 2 2 4 444s   >G G('G(c                     | j         rM| j                            dd          \  }}d                    |                                |g          | _        n| j                                        | _        d| _        d S )NrS   r   T)rg   r0   r   r   rX   r?   )r   r<   rg   s      r   _fix_keywordzCard._fix_keyword  sk     	2'+}':':3'B'B$G_HHgmmoo%GHHDMM M//11DMr    c                    d}|                                  \  }}| j                            |          }|y	 |                    dd          \  }}|                                | _        |                                | _        n# t          t          f$ r
 || _        Y nw xY w| j	        | _
        dS |                    d          | j                            |                    d                    }t          |                    d          t          d          }|                    d          |                    d          |z   }n%|                    d          | j                            |                    d	                    }t          |                    d          t          d          }|                    d          |                    d          |z   }| j                            |                    d
                    }	t          |	                    d          t          d          }
|	                    d          |	                    d          |
z   }
d| d|
 d}|| _
        d| _        dS )z7Fix the card image for fixable non-standard compliance.Nr   r   r   r   r   r   r   r   r   r'   , r&   T)r   r   r\   r   ra   r=   r>   r]   
IndexErrorr1   r3   r   r   r	   FIX_FP_TABLEr?   )r   r=   r<   r   r|   r>   r   r   r   r   r   s              r   
_fix_valuezCard._fix_value  s+    $%%l33 9*!-!3!3C!;!;w"[[]]
&}}
+ * * *)


* $DFWWV__('--aggfoo>>Ddjj00,DDEzz&!!-

6**U2WWV__('--aggfoo>>Ddjj00,DDEzz&!!-

6**U2'--aggfoo>>Ddjj00,DDEzz&!!-

6**U2))))))E! s   AB BBc                    | j         rw| j        r=| j                             dd          d         }d                    |t                    S | j        rd| j          dS d                    | j         t                    S dt          z  S )NrS   r   r   z{:{len}}rY   rR   r   )r<   rg   r   rd   rZ   r6   )r   r<   s     r   _format_keywordzCard._format_keyword  s    < 		(# K,,,S!44Q7!((n(EEE K24<2222!((>(JJJ''r    c                    t           t          j        t          t          j        f}| j        }| j        }| j        | j        v rt          |          }nx| j
        r&| j        st          | j        |          r
| j
        d}nK| j        r5t          | j                                                  }d| j         d| d}nt          |          }| j        s1t!          | j                  t"          k    r|                                }|S )N>20r   r   )rh   rp   rq   rn   rs   r=   r1   r<   r   rV   r3   r@   rU   rg   _format_valuera   rY   rZ   )r   float_typesr=   s      r   r   zCard._format_value  s   bk7B4FG 
 <4444 JJEE	)'	) 4:{33	) (..EE! 	)!$+..4466E8,88888EE!%((E # 	"DL(9(9N(J(JKKMMEr    c                 (    | j         sdS d| j         S )Nr)   z / )r>   r2   r   s    r   _format_commentzCard._format_comment  s!    | 	)2((((r    c                 v   |                                  }|                                 }|                                | j        v }|rd}n|                                 }t
          }|rd}d                    ||||g          }t          |          t          |          z   t          |          z   }|| j        k    ri|	                    d          rT|| j        dz   k    r.|d         dk    r"d                    |d d         |||g          }nt          d| j        d          t          |          | j        k    r|d}nxt          | j        t                    r0t          |          | j        d	z
  k    r|                                 }n.t!          j        d
t$                     |d t&          j                 }|S )Nr)   r   r   r   r   zThe header keyword z with its value is too long80r   z,Card is too long, comment will be truncated.)r   r   ra   r   r   r   r   rY   r   
startswithr]   r<   rU   r=   rV   _format_long_imagerb   rc   r   r   )r   r<   r=   is_commentaryr>   	delimiteroutputkeywordvalue_lengths           r   r   zCard._format_image  s   &&((""$$4+DD 	-GG**,,G
 $	 	I '9eW=>>
 "'llS^^;c%jjH,,1C1CJ1O1O,"dkAo55'"+:L:L'#2#,	5'!JKK !U$,UUU   v;;$+%%^^FF
 $*c** /s5zzT[2=M/N/N0022BM    $+.r    c                    | j         t          j        v r|                                 S d}d}g }| j                            dd          }t          ||          }t          |          D ]\  }}|dk    r"d                    | j         t                    }nd}| j
        s|t          |          d	z
  k    rd
}	nd}	|	                    |          }|                    ||z   d           d}
| j
        rtt          | j
        |          }t          |          D ]O\  }}|t          |          d	z
  k    rd}nd}||
                    |          z   }|                    |d           Pd                    |          S )a5  
        Break up long string value/comment into ``CONTINUE`` cards.
        This is a primitive implementation: it will put the value
        string in one block and the comment string in another.  Also,
        it does not break at the blank space between words.  So it may
        not look pretty.
        C   @   r   r   r   z
{:{len}}= r   z
CONTINUE  r   z'{}'z'{}&'r   z{}zCONTINUE  '' / zCONTINUE  '&' / r)   )r<   r   r   _format_long_commentary_imager1   replacer   	enumeraterd   rZ   r>   rY   r   r   )r   value_lengthcomment_lengthr   r=   wordsidxwordheadstrvalue_formatcomment_formatr>   s               r   r   zCard._format_long_image  s    <444455777 ##C..UL11"5)) 	3 	3ICaxx&--dl-OO& < 'C3u::>$9$9%& ''--EMMWu_112222 < 
	/ ~>>E&u-- / /	T#e**q.((/GG0G!N$9$9$$?$??oo....wwvr    c                 Z   t           j        t          z
  }|                                 }g }d}|t	          |          k     rX|                    t          t          | j        ||||z                                           ||z  }|t	          |          k     Xd                    |          S )z
        If a commentary card's value is too long to fit on a single card, this
        will render the card as multiple consecutive commentary card of the
        same type.
        r   r)   )	r   r   rZ   r   rY   r   rV   r<   r   )r   maxlenr=   r   r  s        r   r   z"Card._format_long_commentary_imageG  s     ~-""$$CJJMM#d4<sS6\7I1JKKLLMMM6MC CJJ wwvr    rc   c           	      B    g }d j         d} j        rt          |          S  j          j        vr j        r j        d d                                         dk    r` j                            d          dk    rB|                    t          d	                     j                   | j
                              j        r% j        d d                                         d	k    s j        rn҉ j        r`                                 d
         }||                                k    r.|                    t          d|d| j                              j         } j        r|                    dd          d
         } j                            |          s'|                    t          d|d                                                      \  }} j          j        v rC j                            |          s(|                    t          d|dd                     nY j        sR j                            |          }|6|                    t          d j         d|d| j
                              j                            |          }|Y|                    d          }|B j                            |          s(|                    t          d|dd                     t           fd|D                       }d _        |S )NzFixed z  card to meet the FITS standard.rQ   rR   r   r   z<Card {!r} is not FITS standard (equal sign not at column 8).)err_textfix_textfixr   r   zCard keyword z is not upper case.rS   r   zIllegal keyword name F)r	  fixablezUnprintable string z>; commentary cards may only contain printable ASCII characterszCard z- is not FITS standard (invalid value string: z).r   z=; header comments may only contain printable ASCII charactersc                 ,    g | ]} j         fi |S r   )
run_option).0erroptionr   s     r   
<listcomp>z Card._verify.<locals>.<listcomp>  s-    HHHC77377HHHr    T)r<   r7   r   r   r4   rX   r   r   dictrd   r   r6   r   r   rg   r   r[   r\   rx   r@   _value_FSC_REr   r   r5   )r   r  errsr
  r<   r   r|   r>   s   ``      r   _verifyzCard._verifyV  s   LDLLLL = 	"D>>! <t888K 9BQB%%'';66  %%**KK((.t|(<(<%  	 	 	 K 	DKO1133zAAdnA{  ++--*gmmoo--KK%SW%S%S%S%- $ 1     lG# 3!--Q//2%++G44 "E'"E"EuUUU  
 !%<4444 &,,\:: 	P, P P P !&     & &,,\::
 9KK!M !M !M:F!M !M !M &. $  	 	 	 %%l33=ggfooG"*0099 	KK!Ng !N !N !N %*     HHHHH4HHHIIr    c              #     K   t          | j                  t          j        z  }t	          dt          j        |z  t          j                  D ]}t                              | j        ||t          j        z                      }|dk    r/|j                                        | j        vrt          d          t          |j        t                    st          d          |V  dS )a  
        If the card image is greater than 80 characters, it should consist of a
        normal card followed by one or more CONTINUE card.  This method returns
        the subcards that make up this logical card.

        This can also support the case where a HISTORY or COMMENT card has a
        long value that is stored internally as multiple concatenated card
        images.
        r   zsLong card images must have CONTINUE cards after the first card or have commentary keywords like HISTORY or COMMENT.z'CONTINUE cards must have string values.N)rY   r4   r   r   ranger   r<   rX   r   r
   rU   r=   rV   )r   ncardsr  r   s       r   r   zCard._itersubcards  s       T[!!T[0DK&0$+>> 	 	C??4;sS4;5F/F#GHHDQww4<--//t7MMM!*   dj#.. M!"KLLLJJJJ	 	r    )NNN)rc   )Jr!   r"   r#   CARD_LENGTHr   r   compilerZ   r[   Ir^   _digits_FSC_digits_NFSC	_numr_FSC
_numr_NFSC_number_FSC_REr   _strg_comm_fieldr   rx   r  r   _rvkc_identifier_rvkc_field_rvkc_field_specifier_srd   _rvkc_field_specifier_val_rvkc_keyword_val_rvkc_keyword_val_commr   r   r   r   unionr   r   r`   r   rD   rG   rJ   rM   propertyr<   setterr=   deleterr   r   r>   rg   rF   r   classmethodr   r   r;   r   r   rO   ri   r   r   r   r   r   r   r   r   r   r   r  r   r   r    r   r   r   )   s       FO BJ4~EFFM#$I24PP 8K@L;&Il*J
  RZ M{ M M MNNN bj!Q,!Q!Q!QRRO 9ECK!rz"@e"@"@"@"@"@AA  RZ,,N BJ	" #	 	 	&  )'	)&,!'	!* $-+	-*0!+	!, $--	-,0-	 MB  RZ		 	 	  *		*-!		! $.	.1!	! $.	.1% 1% 1% 1%	%
 
N '"[0K"-AA+AAA @ G G! ! H)BGGGO#4OOO#-2:.G#.M#N#N 
 'BJ4;;5	
 	
  !+
+A B B<<<,22J<@@ '.$ .$ .$ .$`> > >    ? ? ? 	 	 X	 ^0K 0K ^0Kd   X( \ML ML \ML^ ]  ]     X    X 	 	 X	 ^" " ^"@ _  _ 
 
 X
 " " "" 
 
 
 	 	 X	 
 
 X
*   [& + + [+@0  0  0 d" " "H
 
 
+ + +Z4 4 4l  0B5 B5 B5H  % % %N
( 
( 
(  B) ) )/ / /b1 1 1f  k k k kZ    r    c                    t          | t                    r| S 	 t          |           S # t          t          f$ rH 	 t          |           cY S # t          t          f$ r!}t          t          |                    d}~ww xY ww xY w)z
    Converts an a string to an int if possible, or to a float.

    If the string is neither a string or a float a value error is raised.
    N)rU   rh   rm   r]   	TypeErrorrV   )ses     r   rz   rz     s     !U %1vv	" % % %	%88OOOI& 	% 	% 	%SVV$$$	%%s,   ( BABA=A88A==Bc                 N   t          | t                    r)| dk    rdS |                     dd          }d|dd}|dS t          | t          t          j        f          rt          |           d         dS t          |           r| dS t          | t          t          j	        f          rt          |           dS t          | t          t          j        f          r1d	t          | j                   d
t          | j                   d}|dS t          | t                    rdS dS )zk
    Converts a card value to its appropriate string representation as
    defined by the FITS format.
    r)   r   r   820r   r   z>20dr'   r   r&   )rU   rV   r   ro   rp   rt   rC   r   rh   rq   _format_floatrn   rs   r   r   r   )r=   exp_val_strval_strs      r   r   r     s8    % B;;4--T22K*+****G??" 
ED"(+	,	, u++a.&&&	 	EE2;/	0	0 
&&,,,	EGR%78	9	9 OmEJ//OO=3L3LOOO	E9	%	% rrr    c                     t          |                               dd          }t          |          x}dk    rA|                    d          }|dk     r|dd         }n|dd||z
  z
           ||d         z   }|S )zBFormat a floating number to make sure it is at most 20 characters.r2  E   r   N)rV   r   rY   r   )r=   	value_strstr_lenr  s       r   r6  r6    s    E

""3,,I y>>!R''nnS!!77!#2#II ""8B'C-$8"89IcddOKIr    c                    t          |           }|t          j        k    r| S |t          j        k    r,|t          j        z  }|dk    r| S | dt          j        |z
  z  z   S |t          j        z  }| dt          j        |z
  z  z   S )z9Pad blank space to the input string to be multiple of 80.r   r   )rY   r   r   )input_lenstrlens      r   r   r   %  s    u::Dt{			#Q;;L3$+"6777 #sdkF2333r    )%r   rb   numpyrp   astropy.utils.exceptionsr   r)   r   utilr   r   r   r	   r   r
   r   r   r   __all__rV   	maketransr   r   r  r   rZ   r   rY   r   r_   r   rj   r   rz   r   r6  r   r   r    r   <module>rG     s   
			      7 7 7 7 7 7       ? ? ? ? ? ? ? ? ? ? ? ? A A A A A A A A A A A A;
 }}T4((dD)) ;
c/**          IKK	r r r r r7 r r rj%% % %&     F  "4 4 4 4 4r    