QScintilla/MarkupProviders/HtmlProvider.py

Sat, 07 Jan 2017 19:35:40 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 07 Jan 2017 19:35:40 +0100
changeset 5404
6b19ad5470a3
parent 5402
ce21a78a5fcf
child 5407
f833f89571b8
permissions
-rw-r--r--

Continued implementing a format button bar and provider classes for various markup languages.

# -*- coding: utf-8 -*-

# Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the HTML markup provider.
"""

from __future__ import unicode_literals

from PyQt5.QtWidgets import QDialog

from .MarkupBase import MarkupBase


class HtmlProvider(MarkupBase):
    """
    Class implementing the HTML markup provider.
    """
    def __init__(self):
        """
        Constructor
        """
        super(HtmlProvider, self).__init__()
    
    def kind(self):
        """
        Public method to get the markup kind.
        
        @return string with markup kind
        @rtype str
        """
        return "html"
    
    def hasBold(self):
        """
        Public method to indicate the availability of bold markup.
        
        @return flag indicating the availability of bold markup
        @rtype bool
        """
        return True
    
    def bold(self, editor):
        """
        Public method to generate bold text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        self.__insertMarkup("b", editor)
    
    def hasItalic(self):
        """
        Public method to indicate the availability of italic markup.
        
        @return flag indicating the availability of italic markup
        @rtype bool
        """
        return True
    
    def italic(self, editor):
        """
        Public method to generate italic text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        self.__insertMarkup("i", editor)
    
    def hasStrikethrough(self):
        """
        Public method to indicate the availability of strikethrough markup.
        
        @return flag indicating the availability of strikethrough markup
        @rtype bool
        """
        return True
    
    def strikethrough(self, editor):
        """
        Public method to generate strikethrough text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        self.__insertMarkup("del", editor)
    
    def headerLevels(self):
        """
        Public method to determine the available header levels.
        
        @return supported header levels
        @rtype int
        """
        return 6
    
    def header(self, editor, level):
        """
        Public method to generate a header.
        
        @param editor reference to the editor to work on
        @type Editor
        @param level header level
        @type int
        """
        if level <= 6:
            self.__insertMarkup("h{0}".format(level), editor)
    
    def hasCode(self):
        """
        Public method to indicate the availability of inline code markup.
        
        @return flag indicating the availability of inline code markup
        @rtype bool
        """
        return True
    
    def code(self, editor):
        """
        Public method to generate inline code text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        self.__insertMarkup("code", editor)
    
    def hasCodeBlock(self):
        """
        Public method to indicate the availability of code block markup.
        
        @return flag indicating the availability of code block markup
        @rtype bool
        """
        return True
    
    def codeBlock(self, editor):
        """
        Public method to generate code block text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        if editor is None:
            return
        
        lineSeparator = editor.getLineSeparator()
        editor.beginUndoAction()
        if editor.hasSelectedText():
            newText = "<pre><code>{0}{1}</code></pre>{0}".format(
                lineSeparator, editor.selectedText())
            editor.replaceSelectedText(newText)
        else:
            editor.insert("<pre><code>{0}{0}</code></pre>{0}".format(
                lineSeparator))
            cline, cindex = editor.getCursorPosition()
            editor.setCursorPosition(cline + 1, 0)
        editor.endUndoAction()
    
    def __insertMarkup(self, markup, editor):
        """
        Private method to insert the specified markup.
        
        If the editor has selected text, this text is enclosed by the given
        markup. If no text is selected, the markup is inserted at the cursor
        position and the cursor is positioned in between.
        
        @param markup markup string to be inserted
        @type str
        @param editor reference to the editor to work on
        @type Editor
        """
        if editor is None:
            return
        
        editor.beginUndoAction()
        if editor.hasSelectedText():
            newText = "<{0}>{1}</{0}>".format(markup, editor.selectedText())
            editor.replaceSelectedText(newText)
        else:
            editor.insert("<{0}></{0}>".format(markup))
            cline, cindex = editor.getCursorPosition()
            editor.setCursorPosition(cline, cindex + len(markup) + 2)
        editor.endUndoAction()
    
    def hasHyperlink(self):
        """
        Public method to indicate the availability of hyperlink markup.
        
        @return flag indicating the availability of hyperlink markup
        @rtype bool
        """
        return True
    
    def hyperlink(self, editor):
        """
        Public method to generate hyperlink text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        from .HyperlinkMarkupDialog import HyperlinkMarkupDialog
        dlg = HyperlinkMarkupDialog(True, False)
        if dlg.exec_() == QDialog.Accepted:
            text,  target, title = dlg.getData()
            if not text:
                text = target
            
            if title:
                link = '<a href="{0}" title="{2}">{1}</a>'.format(
                    target, text, title)
            else:
                link = '<a href="{0}">{1}</a>'.format(target, text)
            
            editor.beginUndoAction()
            cline, cindex = editor.getCursorPosition()
            editor.insert(link)
            editor.setCursorPosition(cline, cindex + len(link))
            editor.endUndoAction()
    
    def hasLine(self):
        """
        Public method to indicate the availability of a horizontal line markup.
        
        @return flag indicating the availability of a horizontal line markup
        @rtype bool
        """
        return True
    
    def line(self, editor):
        """
        Public method to generate a horizontal line text.
        
        @param editor reference to the editor to work on
        @type Editor
        """
        if editor is None:
            return
        
        editor.beginUndoAction()
        markup = "<hr />"
        editor.insert(markup)
        cline, cindex = editor.getCursorPosition()
        editor.setCursorPosition(cline, cindex + len(markup))
        editor.endUndoAction()

eric ide

mercurial