BirdyNet/addons/0.documentViewer.QTextBrowser.py

95 lines
2.9 KiB
Python

global HTMLParser
from html.parser import HTMLParser
global html
import html
global browserDoc
class browserDoc(QTextBrowser):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setOpenLinks(False)
style = ""
if (config["accessibility"]["colorBackground"] != "default"):
style += "background-color: " +config["accessibility"]["colorBackground"] + ";"
if (config["accessibility"]["colorText"] != "default"):
style += "color: " +config["accessibility"]["colorText"]+ ";"
self.setStyleSheet("QTextBrowser { " +style+ " }")
self.anchorClicked.connect(self.cAnchorClicked)
class cHtmlParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.output = ""
self.voidElements = ["area","base","br","col","hr","img","input","link","meta","param","command","keygen","source"]
self.blackList = ["img","script","style"]
self.tagDir = []
def handle_starttag(self,tag,attrs):
if not tag in self.voidElements:
self.tagDir.append(tag)
if tag in self.blackList: return
self.output += "<" +html.escape(tag)
for attr in attrs:
self.output += " " +html.escape(attr[0])
if attr[1] != None:
self.output += '="' +html.escape(attr[1])+ '"'
self.output += ">"
def handle_endtag(self,tag):
if not tag in self.voidElements:
index = len(self.tagDir) - 1
while index >= 0:
if self.tagDir[index] == tag:
self.tagDir = self.tagDir[index + 1:]
break
index -= 1
self.output += "</" +html.escape(tag)+ ">"
def handle_data(self,data):
curTag = ""
if len(self.tagDir) > 0:
curTag = self.tagDir[-1]
if curTag in self.blackList: return
self.output += data
def cRenderHtml(self,htm):
parser = self.cHtmlParser()
parser.feed(htm)
self.clear()
self.insertHtml(parser.output)
self.update()
def cAnchorClicked(self,url):
url = str(url.toEncoded(),"utf-8")
browserWindow = self.parent()
curUrl = browserWindow.cDocumentInfo["url"]
curUrlParsed = parseUrl(curUrl)
urlParsed = parseUrl(url)
print("---")
print("navigating from: " +curUrl)
print("to: " +url)
if urlParsed["protocol"] == "": # is relative
if url[0] == "#":
curUrlParsed["anchor"] = url[1:]
url = unparseUrl(curUrlParsed)
elif url[:2] == "//":
url = curUrlParsed["protocol"] + ":" + url
elif url[0] == "/":
urlParsed["protocol"] = curUrlParsed["protocol"]
urlParsed["domain"] = curUrlParsed["domain"]
urlParsed["path"] = urlParsed["path"][1:]
url = unparseUrl(urlParsed)
else:
urlParsed["protocol"] = curUrlParsed["protocol"]
urlParsed["domain"] = curUrlParsed["domain"]
while len(curUrlParsed["path"]) > 0 and curUrlParsed["path"][-1] == "/": curUrlParsed["path"] = curUrlParsed["path"][:-1]
urlParsed["path"] = curUrlParsed["path"] + "/" + url
url = unparseUrl(urlParsed)
browserWindow.cUrlBar.setText(url)
browserWindow.cNavigate()