class HtmlWKPrint(HtmlPrint):
    @staticmethod
    def getPrintTypes(mainControl):
        if WKHtmlWindow:
            return (("html_webkit", u'HTML (Webkit)'), )
        else:
            return ()

    def _buildHtml(self):
        def getTextFromWord(word):
            return self.wikiDocument.getWikiPage(word).getLiveText()

        exporterInstance = PluginManager.getExporterTypeDict(
            self.mainControl, False)[u"html_single"][0](self.mainControl)

        # TODO Progress handler
        # TODO Set additional options
        exporterInstance.setJobData(self.wikiDocument,
                                    self.wordList,
                                    u"html_previewWK",
                                    None,
                                    False,
                                    exporterInstance.getAddOpt(None),
                                    progressHandler=None)

        self.tempFileSet = TempFileSet()
        exporterInstance.tempFileSet = self.tempFileSet
        exporterInstance.styleSheet = u""

        htpath = self.tempFileSet.createTempFile(
            u"", ".html", relativeTo="").decode("latin-1")

        realfp = StringIO.StringIO()
        with open(htpath, "w") as realfp:
            exporterInstance.exportHtmlMultiFile(realfp=realfp, tocMode=0)

        return htpath  # realfp.getvalue().decode("utf-8")

    def doPrint(self,
                printer,
                wikiDocument,
                wordList,
                printType,
                addopt,
                doPreview=False):
        """
        To print with webkit we load the pages into a temporary frame
        that contains a WKHtmlWindow and use webkits print function.

        The frame does not need to be shown as a preview is builtin
        """
        self.setContext(printer, wikiDocument, wordList, printType, addopt)
        if self.checkWebkit():
            import gtk
            htpath = self._buildHtml()
            frame = None

            try:
                # Get page setup dialog data (wxPython) and translate to pyGTK
                psddata = self.printer.getPageSetupDialogData()

                tl = psddata.GetMarginTopLeft()
                br = psddata.GetMarginBottomRight()

                print_op = gtk.PrintOperation()
                page_setup = gtk.PageSetup()
                page_setup.set_top_margin(tl.y, gtk.UNIT_MM)
                page_setup.set_left_margin(tl.x, gtk.UNIT_MM)
                page_setup.set_right_margin(br.x, gtk.UNIT_MM)
                page_setup.set_bottom_margin(br.y, gtk.UNIT_MM)
                print_op.set_default_page_setup(page_setup)

                frame = WKPrintFrame(htpath)
                if doPreview:
                    opCode = gtk.PRINT_OPERATION_ACTION_PREVIEW
                    frame.print_full(print_op, opCode)
                    return False
                else:
                    opCode = gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG
                    result = frame.print_full(print_op, opCode)
                    return result in (gtk.PRINT_OPERATION_RESULT_APPLY,
                                      gtk.PRINT_OPERATION_RESULT_IN_PROGRESS)
            finally:
                if frame:
                    frame.Destroy()
                self._freeHtml()

    def doPreview(self, printer, wikiDocument, wordList, printType, addopt):
        """Preview is built into the print function"""
        self.doPrint(printer,
                     wikiDocument,
                     wordList,
                     printType,
                     addopt,
                     doPreview=True)

    def checkWebkit(self):
        # NOTE: It would be better to check this earlier but I don't
        #       know how to have conditions in XrcControls  -- Ross
        if WKHtmlWindow:
            return True
        else:
            dlg = wx.MessageDialog(None, \
                _('Error loading Webkit: try a different export format)'), \
                _('Error'), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            return False
예제 #2
0
class HtmlWKPrint(HtmlPrint):
    @staticmethod
    def getPrintTypes(mainControl):
        if WKHtmlWindow:
            return (
                ("html_webkit", 'HTML (Webkit)'),
                )
        else:
            return ()


    def _buildHtml(self):
        def getTextFromWord(word):
            return self.wikiDocument.getWikiPage(word).getLiveText()

        exporterInstance = PluginManager.getExporterTypeDict(
                self.mainControl, False)["html_single"][0](self.mainControl)

        # TODO Progress handler
        # TODO Set additional options
        exporterInstance.setJobData(self.wikiDocument, self.wordList,
                "html_previewWK", None, False,
                exporterInstance.getAddOpt(None), progressHandler=None)

        self.tempFileSet = TempFileSet()
        exporterInstance.tempFileSet = self.tempFileSet
        exporterInstance.styleSheet = ""

        htpath = self.tempFileSet.createTempFile(
                    "", ".html", relativeTo="")

#         realfp = StringIO.StringIO()
        with open(htpath, "wb") as realfp:
            exporterInstance.exportHtmlMultiFile(realfp=realfp, tocMode=0)

        return htpath  # realfp.getvalue().decode("utf-8")

    def doPrint(self, printer, wikiDocument, wordList, printType, addopt,
            doPreview=False):
        """
        To print with webkit we load the pages into a temporary frame
        that contains a WKHtmlWindow and use webkits print function.

        The frame does not need to be shown as a preview is builtin
        """
        self.setContext(printer, wikiDocument, wordList, printType, addopt)
        if self.checkWebkit():
            import gtk
            htpath = self._buildHtml()
            frame = None

            try:
                # Get page setup dialog data (wxPython) and translate to pyGTK
                psddata = self.printer.getPageSetupDialogData()

                tl = psddata.GetMarginTopLeft()
                br = psddata.GetMarginBottomRight()

                print_op = gtk.PrintOperation()
                page_setup = gtk.PageSetup()
                page_setup.set_top_margin(tl.y, gtk.UNIT_MM)
                page_setup.set_left_margin(tl.x, gtk.UNIT_MM)
                page_setup.set_right_margin(br.x, gtk.UNIT_MM)
                page_setup.set_bottom_margin(br.y, gtk.UNIT_MM)
                print_op.set_default_page_setup(page_setup)

                frame = WKPrintFrame(htpath)
                if doPreview:
                    opCode = gtk.PRINT_OPERATION_ACTION_PREVIEW
                    frame.print_full(print_op, opCode)
                    return False
                else:
                    opCode = gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG
                    result = frame.print_full(print_op, opCode)
                    return result in (gtk.PRINT_OPERATION_RESULT_APPLY,
                            gtk.PRINT_OPERATION_RESULT_IN_PROGRESS)
            finally:
                if frame:
                    frame.Destroy()
                self._freeHtml()

    def doPreview(self, printer, wikiDocument, wordList, printType, addopt):
        """Preview is built into the print function"""
        self.doPrint(printer, wikiDocument, wordList, printType, addopt,
                doPreview=True)

    def checkWebkit(self):
        # NOTE: It would be better to check this earlier but I don't
        #       know how to have conditions in XrcControls  -- Ross
        if WKHtmlWindow:
            return True
        else:
            dlg = wx.MessageDialog(None, \
                _('Error loading Webkit: try a different export format)'), \
                _('Error'), wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            return False