--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ProjectWeb/Html5Prettifier.py Thu Jan 01 17:14:39 2015 +0100 @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2015 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a class to prettify HTML code. +""" + +from __future__ import unicode_literals + +import re + + +from PyQt5.QtCore import QObject + +import Preferences + + +class Html5Prettifier(QObject): + """ + Class implementing the HTML5 prettifier. + """ + def __init__(self, html, parent=None): + """ + Constructor + + @param html HTML text to be prettified (string) + @param parent reference to the parent object (QObject) + """ + super(Html5Prettifier, self).__init__(parent) + + self.__html = html + self.__indentWidth = Preferences.getEditor("IndentWidth") + + def getPrettifiedHtml(self): + """ + Public method to prettify the HTML code. + + @return prettified HTML code (string) + """ + from bs4 import BeautifulSoup + soup = BeautifulSoup(self.__html, "html.parser") + prettyHtml = soup.prettify(formatter=self.tagPrettify) + # prettify comments + prettyHtml = re.sub("<!--(.*?)-->", self.commentPrettify, prettyHtml, + flags=re.DOTALL) + # indent all HTML + prettyHtml = re.sub("^( *)(.*)$", + r"{0}\2".format(r"\1" * self.__indentWidth), + prettyHtml, flags=re.MULTILINE) + + return prettyHtml + + def tagPrettify(self, tag): + """ + Public method to prettify HTML tags. + + @param tag tag to be prettified (string) + @return prettified tag (string) + """ + result = re.sub(" {{1,{0}}}".format(self.__indentWidth), " ", tag, + flags=re.MULTILINE) + return result + + def commentPrettify(self, matchobj): + """ + Public method to prettify HTML comments. + + @param matchobj reference to the match object (re.MatchObject) + @return prettified comment (string) + """ + if re.search("\n", matchobj.group()): + result = self.tagPrettify(matchobj.group()) + else: + result = matchobj.group() + return result