From f9416b4bc3f8d0fc8e36106b24898a75e293338d Mon Sep 17 00:00:00 2001
From: Hanno Schlichting <hanno@hannosch.eu>
Date: Sat, 10 Jul 2010 09:14:47 +0000
Subject: [PATCH] Factored out the `Products.MIMETools` package into its own
 distribution.

---
 doc/CHANGES.rst                    |   2 +
 setup.py                           |   1 +
 sources.cfg                        |   1 +
 src/Products/MIMETools/MIMETag.py  | 208 -----------------------------
 src/Products/MIMETools/README.txt  | 126 -----------------
 src/Products/MIMETools/__init__.py |  17 ---
 versions.cfg                       |   1 +
 7 files changed, 5 insertions(+), 351 deletions(-)
 delete mode 100644 src/Products/MIMETools/MIMETag.py
 delete mode 100644 src/Products/MIMETools/README.txt
 delete mode 100644 src/Products/MIMETools/__init__.py

diff --git a/doc/CHANGES.rst b/doc/CHANGES.rst
index 16d4a7167..101a54d3d 100644
--- a/doc/CHANGES.rst
+++ b/doc/CHANGES.rst
@@ -22,6 +22,8 @@ Bugs Fixed
 Restructuring
 +++++++++++++
 
+- Factored out the `Products.MIMETools` package into its own distribution.
+
 - Factored out the `Products.ZSQLMethods` into its own distribution. The
   distribution also includes the `Shared.DC.ZRDB` code. The Zope2 distribution
   no longer includes the code automatically. Please depend on the new
diff --git a/setup.py b/setup.py
index 02dbcba05..2a9988cee 100644
--- a/setup.py
+++ b/setup.py
@@ -47,6 +47,7 @@ setup(name='Zope2',
       'Missing',
       'MultiMapping',
       'Persistence',
+      'Products.MIMETools',
       'Products.ZCTextIndex',
       'Record',
       'RestrictedPython',
diff --git a/sources.cfg b/sources.cfg
index 4b0fbe57e..3e95a01b6 100644
--- a/sources.cfg
+++ b/sources.cfg
@@ -9,6 +9,7 @@ Missing = svn svn://svn.zope.org/repos/main/Missing/trunk
 MultiMapping = svn svn://svn.zope.org/repos/main/MultiMapping/trunk
 nt_svcutils = svn svn://svn.zope.org/repos/main/nt_svcutils/trunk
 Persistence = svn svn://svn.zope.org/repos/main/Persistence/trunk
+Products.MIMETools = svn svn://svn.zope.org/repos/main/Products.MIMETools/trunk
 Products.ZCTextIndex = svn svn://svn.zope.org/repos/main/Products.ZCTextIndex/trunk
 Record = svn svn://svn.zope.org/repos/main/Record/trunk
 tempstorage = svn svn://svn.zope.org/repos/main/tempstorage/trunk
diff --git a/src/Products/MIMETools/MIMETag.py b/src/Products/MIMETools/MIMETag.py
deleted file mode 100644
index 3af61f444..000000000
--- a/src/Products/MIMETools/MIMETag.py
+++ /dev/null
@@ -1,208 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE
-#
-##############################################################################
-__rcs_id__='$Id$'
-__version__='$Revision: 1.12 $'[11:-2]
-
-from DocumentTemplate.DT_Util import *
-from DocumentTemplate.DT_String import String
-from cStringIO import StringIO
-import mimetools
-
-MIMEError = "MIME Tag Error"
-
-class MIMETag:
-    '''
-    '''
-
-    name='mime'
-    blockContinuations=('boundary',)
-    encode=None
-
-    def __init__(self, blocks):
-        self.sections = []
-
-        for tname, args, section in blocks:
-            if tname == 'mime':
-                args = parse_params( args
-                                   , type=None, type_expr=None
-                                   , disposition=None, disposition_expr=None
-                                   , encode=None, encode_expr=None
-                                   , name=None, name_expr=None
-                                   , filename=None, filename_expr=None
-                                   , cid=None, cid_expr=None
-                                   , charset=None, charset_expr=None
-                                   , skip_expr=None
-                                   , multipart=None
-                                   )
-                self.multipart = args.get('multipart', 'mixed')
-            else:
-                args = parse_params( args
-                                   , type=None, type_expr=None
-                                   , disposition=None, disposition_expr=None
-                                   , encode=None, encode_expr=None
-                                   , name=None, name_expr=None
-                                   , filename=None, filename_expr=None
-                                   , cid=None, cid_expr=None
-                                   , charset=None, charset_expr=None
-                                   , skip_expr=None
-                                   )
-
-            has_key=args.has_key
-
-            if has_key('type'):
-                type = args['type']
-            else:
-                type = 'application/octet-stream'
-
-            if has_key('type_expr'):
-                if has_key('type'):
-                    raise ParseError, _tm('type and type_expr given', 'mime')
-                args['type_expr']=Eval(args['type_expr'])
-            elif not has_key('type'):
-                args['type']='application/octet-stream'
-
-            if has_key('disposition_expr'):
-                if has_key('disposition'):
-                    raise ParseError, _tm('disposition and disposition_expr given', 'mime')
-                args['disposition_expr']=Eval(args['disposition_expr'])
-            elif not has_key('disposition'):
-                args['disposition']=''
-
-            if has_key('encode_expr'):
-                if has_key('encode'):
-                    raise ParseError, _tm('encode and encode_expr given', 'mime')
-                args['encode_expr']=Eval(args['encode_expr'])
-            elif not has_key('encode'):
-                args['encode']='base64'
-
-            if has_key('name_expr'):
-                if has_key('name'):
-                    raise ParseError, _tm('name and name_expr given', 'mime')
-                args['name_expr']=Eval(args['name_expr'])
-            elif not has_key('name'):
-                args['name']=''
-
-            if has_key('filename_expr'):
-                if has_key('filename'):
-                    raise ParseError, _tm('filename and filename_expr given', 'mime')
-                args['filename_expr']=Eval(args['filename_expr'])
-            elif not has_key('filename'):
-                args['filename']=''
-
-            if has_key('cid_expr'):
-                if has_key('cid'):
-                    raise ParseError, _tm('cid and cid_expr given', 'mime')
-                args['cid_expr']=Eval(args['cid_expr'])
-            elif not has_key('cid'):
-                args['cid']=''
-
-            if has_key('charset_expr'):
-                if has_key('charset'):
-                    raise ParseError, _tm('charset and charset_expr given', 'mime')
-                args['charset_expr']=Eval(args['charset_expr'])
-            elif not has_key('charset'):
-                args['charset']=''
-
-            if has_key('skip_expr'):
-                args['skip_expr']=Eval(args['skip_expr'])
-
-            if args['encode'] not in \
-            ('base64', 'quoted-printable', 'uuencode', 'x-uuencode',
-             'uue', 'x-uue', '7bit'):
-                raise MIMEError, (
-                    'An unsupported encoding was specified in tag')
-
-            self.sections.append((args, section.blocks))
-
-
-    def render(self, md):
-        from MimeWriter import MimeWriter # deprecated since Python 2.3!
-        contents=[]
-        IO = StringIO()
-        IO.write("Mime-Version: 1.0\n")
-        mw = MimeWriter(IO)
-        outer = mw.startmultipartbody(self.multipart)
-        for x in self.sections:
-            a, b = x
-            has_key=a.has_key
-
-            if has_key('skip_expr') and a['skip_expr'].eval(md):
-                continue
-
-            inner = mw.nextpart()
-
-            if has_key('type_expr'): t=a['type_expr'].eval(md)
-            else: t=a['type']
-
-            if has_key('disposition_expr'): d=a['disposition_expr'].eval(md)
-            else: d=a['disposition']
-
-            if has_key('encode_expr'): e=a['encode_expr'].eval(md)
-            else: e=a['encode']
-
-            if has_key('name_expr'): n=a['name_expr'].eval(md)
-            else: n=a['name']
-
-            if has_key('filename_expr'): f=a['filename_expr'].eval(md)
-            else: f=a['filename']
-
-            if has_key('cid_expr'): cid=a['cid_expr'].eval(md)
-            else: cid=a['cid']
-
-            if has_key('charset_expr'): charset=a['charset_expr'].eval(md)
-            else: charset=a['charset']
-
-            if d:
-                if f:
-                    inner.addheader('Content-Disposition', '%s;\n filename="%s"' % (d, f))
-                else:
-                    inner.addheader('Content-Disposition', d)
-
-            inner.addheader('Content-Transfer-Encoding', e)
-
-            if cid:
-                inner.addheader('Content-ID', '<%s>' % cid)
-
-            if n:
-                plist = [('name', n)]
-            else:
-                plist = []
-
-            if t.startswith('text/'):
-                plist.append(('charset', charset or 'us-ascii'))
-
-            innerfile = inner.startbody(t, plist, 1)
-
-            output = StringIO()
-            if e == '7bit':
-                innerfile.write(render_blocks(b, md))
-            else:
-                mimetools.encode(StringIO(render_blocks(b, md)),
-                                 output, e)
-                output.seek(0)
-                innerfile.write(output.read())
-
-        # XXX what if self.sections is empty ??? does it matter that mw.lastpart() is called
-        # right after mw.startmultipartbody() ?
-        if x is self.sections[-1]:
-            mw.lastpart()
-
-        outer.seek(0)
-        return outer.read()
-
-
-    __call__=render
-
-
-
-String.commands['mime'] = MIMETag
diff --git a/src/Products/MIMETools/README.txt b/src/Products/MIMETools/README.txt
deleted file mode 100644
index 2250c9f88..000000000
--- a/src/Products/MIMETools/README.txt
+++ /dev/null
@@ -1,126 +0,0 @@
-The MIMETools Product
-
- The MIMETools product is alpha quality software.  It may not work as
- documented or at all.  If you encounter bugs in MIMETools, please
- report your problem to support@digicool.com or discuss it on the Zope 
- mailing list, zope@zope.org.
-
- Currently, the MIMETools product's only function is to provide the
- <!--#mime--> DTML tag.
-
- The <!--#mime--> tag is used to construct MIME containers.  The
- syntax of the <!--#mime--> tag is:
-
-
- <!--#mime [type=x, disposition=y, encode=z]-->
-
-  Contents of first part
-
- <!--#boundary [type=x, disposition=y, encode=z]--> 
-
-  Contents of second part
-   
- <!--#boundary [type=x, disposition=y, encode=z]--> 
-
-  Contents of nth part
-
- <!--#/mime-->
-
-
- The area of data between tags, called a block, is encoded into
- whatever is specified with the 'encode' tag attribute for that block.
- If no encoding is specified, 'base64' is defaulted.  Valid encoding
- options include 'base64', 'quoted-printable', 'uuencode',
- 'x-uuencode', 'uue' and 'x-uue'.  If the 'encode' attribute is set to
- '7bit' no encoding is done on the block and the data is assumed to be
- in a valid MIME format.
-
- If the 'disposition' attribute is not specified for a certain block,
- then the 'Content-Disposition:' MIME header is not included in that
- block's MIME part.
-
- The entire MIME container, from the opening mime tag to the closing,
- has it's 'Content-Type:' MIME header set to 'multipart/mixed'.
-
- For example, the following DTML:
-
-  <!--#mime encode=7bit type=text/plain-->
-  This is the first part.
-  <!--#boundary encode=base64 type=text/plain-->
-  This is the second.
-  <!--#/mime-->
-
- Is rendered to the following text:
-
-  Content-Type: multipart/mixed;
-      boundary="216.164.72.30.501.1550.923070182.795.22531"
-
-
-  --216.164.72.30.501.1550.923070182.795.22531
-  Content-Type: text/plain
-  Content-Transfer-Encoding: 7bit
-
-  This is the first part.
-
-  --216.164.72.30.501.1550.923070182.795.22531
-  Content-Type: text/plain
-  Content-Transfer-Encoding: base64
-
-  VGhpcyBpcyB0aGUgc2Vjb25kLgo=
-
-  --216.164.72.30.501.1550.923070182.795.22531--
-
-
- The #mime tag is particulary handy in conjunction with the #sendmail
- tag.  This allows Zope to send attachments along with email.  Here is 
- an example:
-
-  Create a DTML method called 'input' with the following code:
-
-    <!--#var standard_html_header-->
-    <form method=post action="send" ENCTYPE="multipart/form-data">
-    <input type=file name="afile"><br>
-    Send to:<input type=textbox name="who"><br>
-    <input type=submit value="Send">
-    </form>
-    <!--#var standard_html_footer-->
-
-
-  Create another DTML Method called 'send' with the following code:
-
-    <!--#var standard_html_header-->
-    <!--#sendmail smtphost=localhost -->
-    From: michel@digicool.com
-    To: <!--#var who-->
-    <!--#mime type=text/plain encode=7bit-->
-
-    Hi <!--#var who-->, someone sent you this attachment.
-
-    <!--#boundary type=application/octet-stream disposition=attachment 
-    encode=base64--><!--#var "afile.read()"--><!--#/mime-->
-
-    <!--#/sendmail-->
-
-    Mail with attachment was sent.
-    <!--#var standard_html_footer-->
-
-
-  Notice that there is no blank line between the 'To:' header and the
-  starting #mime tag.  If a blank line is inserted between them then
-  the message will not be interpreted as multipart by the recieving mailreader.
-
-  Also notice that there is no newline between the #boundary tag and
-  the #var tag, or the end of the #var tag and the closing #mime tag.
-  This is important, if you break the tags up with newlines then they
-  will be encoded and included in the MIME part, which is probably not
-  what you're after.
-
-  As per the MIME spec, #mime tags may be nested within #mime tags arbitrarily.
-
-
-
-
-
-
-
-
diff --git a/src/Products/MIMETools/__init__.py b/src/Products/MIMETools/__init__.py
deleted file mode 100644
index 98a2a87bf..000000000
--- a/src/Products/MIMETools/__init__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE
-#
-##############################################################################
-__doc__='''MIMETools Product Initialization
-$Id$'''
-__version__='$Revision: 1.3 $'[11:-2]
-
-import MIMETag
diff --git a/versions.cfg b/versions.cfg
index 3f98dffc2..7ea6ae188 100644
--- a/versions.cfg
+++ b/versions.cfg
@@ -15,6 +15,7 @@ Missing = 2.13.1
 MultiMapping = 2.13.0
 nt-svcutils = 2.13.0
 Persistence = 2.13.2
+Products.MIMETools = 2.13.0
 Products.ZCTextIndex = 2.13.0
 Record = 2.13.0
 tempstorage = 2.11.3
-- 
2.30.9