]> git.phdru.name Git - mimedecode.git/commitdiff
Change option -d to decode all headers with exceptions
authorOleg Broytman <phd@phdru.name>
Sat, 8 Mar 2014 13:41:32 +0000 (17:41 +0400)
committerOleg Broytman <phd@phdru.name>
Sat, 8 Mar 2014 13:41:32 +0000 (17:41 +0400)
Change option -d to decode all headers and accept a list of exceptions:
-d *,-h1,-h2,...

ANNOUNCE
TODO
mimedecode.docbook
mimedecode.py
test/test_all

index dfca45c190ac0a32b86801bb555504bcd07683c9..662f947bf6e4f957ba6b9cc878d7e168c87323e7 100644 (file)
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -28,6 +28,9 @@ WHAT'S NEW in version 2.4.0 (2014-03-??)
    Change option -d to accept a comma-separated list of headers:
 -d h1,h2,h3,...
 
+   Change option -d to decode all headers and accept a list of exceptions:
+-d *,-h1,-h2,...
+
    Add ChangeLog.
 
 WHAT'S NEW in version 2.3.8 (2014-02-26)
diff --git a/TODO b/TODO
index fae378bd54c93136e8f8e7a0079a773ad9d9825d..4428a0a4c033a524cc7095237231d29746adfade 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,3 @@
-Change option -d to decode all headers and accept a list of exceptions:
--d *,-h1,-h2,...
-
-
 Change option -p to accept lists of headers and parameters:
 -p h1,h2,h3:p1,p2,p3
 Allow * and exceptions:
index 28af4acd0d4e0b7e35d725fa681b7149221331c2..4cbd688f4535900ad77716890ed4f7920b17da75 100644 (file)
@@ -50,6 +50,9 @@
       <arg choice="opt">
          <option>-d header1[,header2,header3...]</option>
       </arg>
+      <arg choice="opt">
+         <option>-d *[,-header1,-header2,-header3...]</option>
+      </arg>
       <arg choice="opt">
          <option>-p header:param</option>
       </arg>
       </listitem>
    </varlistentry>
 
+   <varlistentry>
+      <term>-d *[,-header1,-header2,-header3...]</term>
+      <listitem>
+         <para>
+           This variant completely changes headers decoding. First, the list of
+           headers to decode is cleared. Then all the headers are decoded
+           except the given list of exceptions (headers listed with '-'). In
+           this mode it would be meaningless to give more than one -d options
+           but the program doesn't enforce it.
+         </para>
+
+         <para>
+           Please be warned that the asterisk is a shell metacharacter and
+           should be escaped or quoted. Either write -d \*,-h1,-h2 or -d
+           '*,-h1,-h2'.
+         </para>
+      </listitem>
+   </varlistentry>
+
    <varlistentry>
       <term>-D</term>
       <listitem>
index 82f2d26108a43317f13ef295635b38850713449d..23493d40e4ed1a370cd800d2e6dbdb829af88d03 100755 (executable)
@@ -18,7 +18,7 @@ Broytman mimedecode.py version %s, %s
 def usage(code=0, errormsg=''):
     version(0)
     sys.stdout.write("""\
-Usage: %s [-h|--help] [-V|--version] [-cCDP] [-H|--host=hostname] [-f charset] [-d header1[,header2,header3...]] [-p header:param] [-r header] [-R header:param] [--remove-params=header] [-beit mask] [-o output_file] [input_file [output_file]]
+Usage: %s [-h|--help] [-V|--version] [-cCDP] [-H|--host=hostname] [-f charset] [-d header1[,h2,...]|*[,-h1,...]] [-p header:param] [-r header] [-R header:param] [--remove-params=header] [-beit mask] [-o output_file] [input_file [output_file]]
 """ % me)
     if errormsg:
         sys.stderr.write(errormsg + '\n')
@@ -114,8 +114,15 @@ def decode_headers(msg):
         msg.del_param(param, header)
 
     for header_list in gopts.decode_headers:
-        for header in header_list.split(','):
-            decode_header(msg, header)
+        header_list = header_list.split(',')
+        if header_list[0] == '*': # Decode all headers except listed
+            header_list = [h[1:].lower() for h in header_list[1:] if h[0]=='-']
+            for header in msg.keys():
+                if header.lower() not in header_list:
+                    decode_header(msg, header)
+        else: # Decode listed hiders
+            for header in header_list:
+                decode_header(msg, header)
 
     for header, param in gopts.decode_header_params:
         decode_header_param(msg, header, param)
@@ -340,6 +347,8 @@ def get_opt():
         elif option == '-f':
             gopts.default_encoding = value
         elif option == '-d':
+            if value.startswith('*'):
+                gopts.decode_headers = []
             gopts.decode_headers.append(value)
         elif option == '-D':
             gopts.decode_headers = []
index bf826c6ab76ac9cf186414829321c9cf1e1aa4a5..25f8183fe310040d1ca151312c90774cbb9617ea 100755 (executable)
@@ -40,6 +40,8 @@ for f in input/*.txt; do
 done
 
 test_file msg_03.txt msg_03-1.txt -D -d From,To,Subject
+test_file msg_03.txt msg_03-1.txt -d '*,-cc'
+test_file msg_03.txt msg_03-1.txt -d \*,From,To,Subject,-cc
 test_file msg_15.txt msg_15-1.txt -b text/html
 test_file msg_15.txt msg_15-2.txt -i text/html
 test_file msg_22.txt msg_22-1.txt -r content-id