diff -r f99d60d6b59b -r 2602857055c5 eric6/Helpviewer/Network/QtHelpAccessHandler.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eric6/Helpviewer/Network/QtHelpAccessHandler.py Sun Apr 14 15:09:21 2019 +0200 @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2009 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a scheme access handler for QtHelp. +""" + +from __future__ import unicode_literals + +import mimetypes +import os + +from PyQt5.QtCore import QByteArray + +from .SchemeAccessHandler import SchemeAccessHandler + +from .NetworkReply import NetworkReply + +QtDocPath = "qthelp://com.trolltech." + +ExtensionMap = { + ".bmp": "image/bmp", + ".css": "text/css", + ".gif": "image/gif", + ".html": "text/html", + ".htm": "text/html", + ".ico": "image/x-icon", + ".jpeg": "image/jpeg", + ".jpg": "image/jpeg", + ".js": "application/x-javascript", + ".mng": "video/x-mng", + ".pbm": "image/x-portable-bitmap", + ".pgm": "image/x-portable-graymap", + ".pdf": "application/pdf", + ".png": "image/png", + ".ppm": "image/x-portable-pixmap", + ".rss": "application/rss+xml", + ".svg": "image/svg+xml", + ".svgz": "image/svg+xml", + ".text": "text/plain", + ".tif": "image/tiff", + ".tiff": "image/tiff", + ".txt": "text/plain", + ".xbm": "image/x-xbitmap", + ".xml": "text/xml", + ".xpm": "image/x-xpm", + ".xsl": "text/xsl", + ".xhtml": "application/xhtml+xml", + ".wml": "text/vnd.wap.wml", + ".wmlc": "application/vnd.wap.wmlc", +} + + +class QtHelpAccessHandler(SchemeAccessHandler): + """ + Class implementing a scheme access handler for QtHelp. + """ + def __init__(self, engine, parent=None): + """ + Constructor + + @param engine reference to the help engine (QHelpEngine) + @param parent reference to the parent object (QObject) + """ + SchemeAccessHandler.__init__(self, parent) + + self.__engine = engine + + def __mimeFromUrl(self, url): + """ + Private method to guess the mime type given an URL. + + @param url URL to guess the mime type from (QUrl) + @return mime type for the given URL (string) + """ + path = url.path() + ext = os.path.splitext(path)[1].lower() + if ext in ExtensionMap: + return ExtensionMap[ext] + else: + return "application/octet-stream" + + def createRequest(self, op, request, outgoingData=None): + """ + Public method to create a request. + + @param op the operation to be performed + (QNetworkAccessManager.Operation) + @param request reference to the request object (QNetworkRequest) + @param outgoingData reference to an IODevice containing data to be sent + (QIODevice) + @return reference to the created reply object (QNetworkReply) + """ + url = request.url() + strUrl = url.toString() + + # For some reason the url to load is already wrong (passed from webkit) + # though the css file and the references inside should work that way. + # One possible problem might be that the css is loaded at the same + # level as the html, thus a path inside the css like + # (../images/foo.png) might cd out of the virtual folder + if not self.__engine.findFile(url).isValid(): + if strUrl.startswith(QtDocPath): + newUrl = request.url() + if not newUrl.path().startswith("/qdoc/"): + newUrl.setPath("qdoc" + newUrl.path()) + url = newUrl + strUrl = url.toString() + + mimeType = mimetypes.guess_type(strUrl)[0] + if mimeType is None: + # do our own (limited) guessing + mimeType = self.__mimeFromUrl(url) + + if self.__engine.findFile(url).isValid(): + data = self.__engine.fileData(url) + else: + data = QByteArray(self.tr( + """<title>Error 404...</title>""" + """<div align="center"><br><br>""" + """<h1>The page could not be found</h1><br>""" + """<h3>'{0}'</h3></div>""").format(strUrl).encode("utf-8")) + return NetworkReply(request, data, mimeType, self.parent())