WizardDataUriEncoder/DataUriEncoderWizardDialog.py

changeset 1
2fa6997ff09c
child 2
f33d9d82ae69
diff -r 3ad485fab7d4 -r 2fa6997ff09c WizardDataUriEncoder/DataUriEncoderWizardDialog.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizardDataUriEncoder/DataUriEncoderWizardDialog.py	Sun Dec 29 19:41:52 2013 +0100
@@ -0,0 +1,252 @@
+# -*- coding: utf-8 -*-
+
+"""
+Module implementing DataUriEncoderWizardDialog.
+"""
+
+import os
+import mimetypes
+import base64
+import getpass
+import datetime
+
+from PyQt4.QtCore import pyqtSlot
+from PyQt4.QtGui import QDialog, QDialogButtonBox, QApplication, QInputDialog
+
+from E5Gui.E5Completers import E5FileCompleter
+from E5Gui import E5FileDialog, E5MessageBox
+
+from .Ui_DataUriEncoderWizardDialog import Ui_DataUriEncoderWizardDialog
+
+import Preferences
+import Utilities
+import UI.PixmapCache
+
+
+Python2Template = """#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from base64 import b64decode
+from cStringIO import StringIO
+
+#metadata
+__author__ = '{0}'
+__date__ = '{1}'
+
+
+embedded_file = StringIO(b64decode({2}))
+print(embedded_file.read())
+"""
+
+
+Python3Template = """#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from base64 import b64decode
+from io import BytesIO
+
+#metadata
+__author__ = '{0}'
+__date__ = '{1}'
+
+
+embedded_file = BytesIO(b64decode({2}))
+print(embedded_file.read())
+"""
+
+
+class DataUriEncoderWizardDialog(QDialog, Ui_DataUriEncoderWizardDialog):
+    """
+    Class documentation goes here.
+    """
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget (QWidget)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False)
+        
+        self.__fileCompleter = E5FileCompleter(self.fileEdit)
+        
+        self.fileButton.setIcon(UI.PixmapCache.getIcon("open.png"))
+        
+        self.embeddingComboBox.addItems([
+            self.tr('Do not generate code'),
+            self.tr('Generate CSS embed code'),
+            self.tr('Generate Python3 embed code'),
+            self.tr('Generate Python2 embed code'),
+            self.tr('Generate HTML embed code'),
+            self.tr('Generate JS embed code'),
+            self.tr('Generate QML embed code'),
+        ])
+    
+    def __getStartDir(self):
+        """
+        Private method to get the start directory for selection dialogs.
+        
+        @return start directory (string)
+        """
+        return (Preferences.getMultiProject("Workspace") or
+                Utilities.getHomeDir())
+    
+    @pyqtSlot()
+    def on_fileButton_clicked(self):
+        """
+        Private slot to select the file to be encoded via a selection dialog.
+        """
+        start = Utilities.fromNativeSeparators(self.fileEdit.text()) or \
+            self.__getStartDir()
+        inputFile = E5FileDialog.getOpenFileName(
+            self,
+            self.trUtf8("Data URI Encoder"),
+            start,
+            self.trUtf8(
+                "Audio Files (*.flac *.mp3 *.ogg *.wav *.weba *.wma);;"
+                "Image Files (*.gif *.ico *.jpg *.png *.svg *.tif *.webp"
+                " *.xpm);;"
+                "Video Files (*.3gp *.avi *.flv *.mp4 *.ogv *.webm *.wmv);;"
+                "All Files (*)"
+            )
+        )
+        if inputFile:
+            self.fileEdit.setText(Utilities.toNativeSeparators(inputFile))
+    
+    @pyqtSlot(int)
+    def on_embeddingComboBox_currentIndexChanged(self, index):
+        """
+        Private slot to handle the selection of an embedding method.
+        
+        @param index index of the selected entry (integer)
+        """
+        if index in [1, 4]:
+            self.encryptCheckBox.setChecked(False)
+            self.dataCheckBox.setChecked(True)
+        elif index in [2, 3, 5, 6]:
+            self.encryptCheckBox.setChecked(False)
+            self.dataCheckBox.setChecked(False)
+    
+    @pyqtSlot()
+    def on_encodeButton_clicked(self):
+        """
+        Private slot to encode the contents of the given file.
+        """
+        filepath = Utilities.toNativeSeparators(self.fileEdit.text().strip())
+        mime = mimetypes.guess_type(filepath, strict=False)
+        mimetype = mime if mime is not None else self.__askMime()
+        
+        if os.path.getsize(filepath) // 1024 // 1024 >= 1:
+            res = E5MessageBox.warning(
+                self,
+                self.trUtf8("Data URI Encoder"),
+                self.trUtf8(
+                    """The file size is > 1 Megabyte. Encoding this will"""
+                    """ take some time depending on your CPU processing"""
+                    """ power!"""),
+                E5MessageBox.StandardButtons(
+                    E5MessageBox.Cancel |
+                    E5MessageBox.Ok),
+                E5MessageBox.Cancel)
+            if res == E5MessageBox.Cancel:
+                return
+        
+        try:
+            output = '"{0}{1}{2}{3}"'.format(
+                'data:' if self.dataCheckBox.isChecked() else '',
+                mimetype if self.dataCheckBox.isChecked() else '',
+                ';charset=utf-8;base64,' if self.dataCheckBox.isChecked()
+                    else '',
+                base64.b64encode(open(filepath, "rb").read()).decode()
+            )
+        except (IOError, OSError) as err:
+            E5MessageBox.critical(
+                self,
+                self.trUtf8("Data URI Encoder"),
+                self.trUtf8(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>""").format(filepath, str(err)))
+            return
+        if self.embeddingComboBox.currentIndex() == 1:
+            output = ('html, body {{ margin:0; padding:0; background: url({0})'
+                      ' no-repeat center center fixed; background-size:cover'
+                      ' }}'.format(output))
+        elif self.embeddingComboBox.currentIndex() == 2:
+            output = Python3Template.format(
+                getpass.getuser(),
+                datetime.datetime.now().isoformat().split('.')[0], output)
+        elif self.embeddingComboBox.currentIndex() == 3:
+            output = Python2Template.format(
+                getpass.getuser(),
+                datetime.datetime.now().isoformat().split('.')[0], output)
+        elif self.embeddingComboBox.currentIndex() == 4:
+            output = '<img src={0} alt="{1}" title="{1}"/>'.format(
+                output, os.path.basename(filepath))
+        elif self.embeddingComboBox.currentIndex() == 5:
+            output = 'var embedded_file = window.atob({0}); '.format(output)
+        elif self.embeddingComboBox.currentIndex() == 6:
+            output = 'Image {{ source: {0} }} '.format(output)
+        
+        if self.encryptCheckBox.isChecked():
+            output = output.encode('rot_13')
+        
+        self.outputTextEdit.setPlainText(output)
+    
+    @pyqtSlot()
+    def on_copyButton_clicked(self):
+        """
+        Private slot to copy the output to the clipboard.
+        """
+        QApplication.clipboard().setText(self.outputTextEdit.toPlainText())
+    
+    @pyqtSlot()
+    def on_outputTextEdit_textChanged(self):
+        """
+        Private slot to handle the existence of some output text.
+        """
+        enable = bool(self.outputTextEdit.toPlainText())
+        self.copyButton.setEnabled(enable)
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable)
+    
+    @pyqtSlot(str)
+    def on_fileEdit_textChanged(self, txt):
+        """
+        Private slot to handle the editing of the file name.
+        
+        @param txt current file name (string)
+        """
+        self.encodeButton.setEnabled(bool(txt) and os.path.isfile(txt))
+    
+    def __askMime(self):
+        """
+        Private method to get the mime type from the user.
+        
+        @return entered mime type (string)
+        """
+        mimetypesList = [""] + list(sorted(
+            set(mimetypes.types_map.values()).union( 
+                set(mimetypes.common_types.values()))))
+        try:
+            index = mimetypesList.index("application/octet-stream")
+        except ValueError:
+            index = 0
+        mimetype, ok = QInputDialog.getItem(
+            self,
+            self.trUtf8("Data URI Encoder"),
+            self.trUtf8("Enter a mime type:"),
+            mimetypesList,
+            index, True)
+        if ok:
+            return mimetype.lower()
+        else:
+            return ""
+    
+    def getCode(self):
+        """
+        Public method to get the code.
+        
+        @return generated code (string)
+        """
+        return self.outputTextEdit.toPlainText()

eric ide

mercurial