Merged with default branch to prepare a new release. maintenance release-19.11

Fri, 01 Nov 2019 16:11:27 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 01 Nov 2019 16:11:27 +0100
branch
maintenance
changeset 7322
cd8ee889589f
parent 7287
1c17f2191bdd (current diff)
parent 7321
3642cc5df144 (diff)
child 7323
83df7d69e61b

Merged with default branch to prepare a new release.

docs/changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.QScintilla.Editor.html file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
eric6/QScintilla/Editor.py file | annotate | diff | comparison | revisions
eric6/UI/Previewers/PreviewerHTML.py file | annotate | diff | comparison | revisions
eric6/UI/UserInterface.py file | annotate | diff | comparison | revisions
eric6/WebBrowser/Network/NetworkManager.py file | annotate | diff | comparison | revisions
eric6/i18n/eric6_cs.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_de.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_empty.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_en.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_es.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_fr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_it.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_pt.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_ru.qm file | annotate | diff | comparison | revisions
eric6/i18n/eric6_ru.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_tr.ts file | annotate | diff | comparison | revisions
eric6/i18n/eric6_zh_CN.ts file | annotate | diff | comparison | revisions
scripts/install.py file | annotate | diff | comparison | revisions
--- a/docs/changelog	Thu Oct 03 11:12:50 2019 +0200
+++ b/docs/changelog	Fri Nov 01 16:11:27 2019 +0100
@@ -1,5 +1,25 @@
 Change Log
 ----------
+Version 19.11:
+- bug fixes
+- Editor
+  -- extended the spell checking functionality for all text files
+  -- added a context menu to select spell check language
+  -- made the preview refresh timeout configurable
+     (see Editor -> File Handling config page)
+- Error Message Dialog:
+  - added a configurable minimum severity for messages being shown in a dialog
+    (see Application config page)
+- MicroPython
+  -- added support for PyBoard
+- Previewers
+  -- enhanced the Markdown previewer by using the PyMdown extensions, if
+     they are available and have been enabled
+  -- enhanced the Markdown previewer to support MathJax, if it has been
+     enabled
+  -- enhanced the Markdown previewer to support Mermaid via the md_mermaid
+     extension, if it is available and has been enabled
+
 Version 19.10:
 - bug fixes
 - removed runtime support for Python2 and PyQt4
--- a/eric6.e4p	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6.e4p	Fri Nov 01 16:11:27 2019 +0100
@@ -259,6 +259,7 @@
     <Source>eric6/MicroPython/MicroPythonSerialPort.py</Source>
     <Source>eric6/MicroPython/MicroPythonWidget.py</Source>
     <Source>eric6/MicroPython/MicrobitDevices.py</Source>
+    <Source>eric6/MicroPython/PyBoardDevices.py</Source>
     <Source>eric6/MicroPython/__init__.py</Source>
     <Source>eric6/MultiProject/AddProjectDialog.py</Source>
     <Source>eric6/MultiProject/MultiProject.py</Source>
@@ -297,6 +298,7 @@
     <Source>eric6/Plugins/AboutPlugin/AboutDialog.py</Source>
     <Source>eric6/Plugins/AboutPlugin/__init__.py</Source>
     <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/AnnotationsChecker.py</Source>
+    <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py</Source>
     <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py</Source>
     <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py</Source>
     <Source>eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py</Source>
@@ -1196,7 +1198,9 @@
     <Source>eric6/UI/NumbersWidget.py</Source>
     <Source>eric6/UI/PixmapCache.py</Source>
     <Source>eric6/UI/Previewer.py</Source>
+    <Source>eric6/UI/Previewers/MarkdownExtensions.py</Source>
     <Source>eric6/UI/Previewers/PreviewerHTML.py</Source>
+    <Source>eric6/UI/Previewers/PreviewerHTMLStyles.py</Source>
     <Source>eric6/UI/Previewers/PreviewerQSS.py</Source>
     <Source>eric6/UI/Previewers/__init__.py</Source>
     <Source>eric6/UI/PythonAstViewer.py</Source>
@@ -1854,6 +1858,7 @@
     <Form>eric6/Preferences/ConfigurationPages/WebBrowserFlashCookieManagerPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/WebBrowserPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.ui</Form>
+    <Form>eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.ui</Form>
     <Form>eric6/Preferences/MouseClickDialog.ui</Form>
     <Form>eric6/Preferences/ProgramsDialog.ui</Form>
     <Form>eric6/Preferences/ShortcutDialog.ui</Form>
@@ -2034,9 +2039,6 @@
     <Other>eric6/APIs/MicroPython/circuitpython.api</Other>
     <Other>eric6/APIs/MicroPython/microbit.api</Other>
     <Other>eric6/APIs/MicroPython/micropython.api</Other>
-    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
-    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
-    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/Python3/PyQt4.bas</Other>
     <Other>eric6/APIs/Python3/PyQt5.bas</Other>
     <Other>eric6/APIs/Python3/PyQtChart.bas</Other>
@@ -2044,6 +2046,9 @@
     <Other>eric6/APIs/Python3/QScintilla2.bas</Other>
     <Other>eric6/APIs/Python3/eric6.api</Other>
     <Other>eric6/APIs/Python3/eric6.bas</Other>
+    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
+    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
+    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/QSS/qss.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.bas</Other>
--- a/eric6/APIs/Python3/eric6.api	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/APIs/Python3/eric6.api	Fri Nov 01 16:11:27 2019 +0100
@@ -2400,6 +2400,21 @@
 eric6.MicroPython.MicrobitDevices.MicrobitDevice.runScript?4(script)
 eric6.MicroPython.MicrobitDevices.MicrobitDevice.setButtons?4()
 eric6.MicroPython.MicrobitDevices.MicrobitDevice?1(microPythonWidget, parent=None)
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.DeviceVolumeName?7
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.FlashInstructionsURL?7
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.addDeviceMenuEntries?4(menu)
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.canRunScript?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.canStartFileManager?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.canStartPlotter?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.canStartRepl?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.deviceName?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.forceInterrupt?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.getDocumentationUrl?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.getWorkspace?4(silent=False)
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.runScript?4(script)
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.setButtons?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice.supportsLocalFileAccess?4()
+eric6.MicroPython.PyBoardDevices.PyBoardDevice?1(microPythonWidget, parent=None)
 eric6.MultiProject.AddProjectDialog.AddProjectDialog.getData?4()
 eric6.MultiProject.AddProjectDialog.AddProjectDialog.on_filenamePicker_textChanged?4(txt)
 eric6.MultiProject.AddProjectDialog.AddProjectDialog.on_nameEdit_textChanged?4(txt)
@@ -2869,6 +2884,12 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker.FunctionVisitor?1(sourceLines)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker.getAnnotationComplexity?4(annotationNode)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker.hasTypeAnnotations?4(funcNode)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.getValue?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.isBaseString?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.isBytes?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.isNameConstant?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.isNumber?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.isString?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.CodeStyleAddBuiltinIgnoreDialog.getData?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.CodeStyleAddBuiltinIgnoreDialog.on_leftEdit_textChanged?4(txt)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.CodeStyleAddBuiltinIgnoreDialog.on_rightEdit_textChanged?4(txt)
@@ -3002,6 +3023,7 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_Bytes?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_Call?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_ClassDef?4(node)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_Constant?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_FunctionDef?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_Module?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.TextVisitor.visit_Str?4(node)
@@ -6110,6 +6132,7 @@
 eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage.on_editFileFilterButton_clicked?4()
 eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage.on_fileFiltersList_currentItemChanged?4(current, previous)
 eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage.on_openFiltersButton_toggled?4(checked)
+eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked?4()
 eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage.save?4()
 eric6.Preferences.ConfigurationPages.EditorFilePage.EditorFilePage?1()
 eric6.Preferences.ConfigurationPages.EditorFilePage.create?4(dlg)
@@ -7254,6 +7277,7 @@
 eric6.QScintilla.Editor.Editor.getSearchIndicatorLines?4()
 eric6.QScintilla.Editor.Editor.getSearchText?4(selectionOnly=False)
 eric6.QScintilla.Editor.Editor.getSharingStatus?4()
+eric6.QScintilla.Editor.Editor.getSpellingLanguage?4()
 eric6.QScintilla.Editor.Editor.getSyntaxErrorLines?4()
 eric6.QScintilla.Editor.Editor.getSyntaxErrors?4()
 eric6.QScintilla.Editor.Editor.getTaskLines?4()
@@ -7366,6 +7390,7 @@
 eric6.QScintilla.Editor.Editor.showMenu?7
 eric6.QScintilla.Editor.Editor.smartIndentLineOrSelection?4()
 eric6.QScintilla.Editor.Editor.sortLines?4()
+eric6.QScintilla.Editor.Editor.spellLanguageChanged?7
 eric6.QScintilla.Editor.Editor.startSharedEdit?4()
 eric6.QScintilla.Editor.Editor.streamCommentLine?4()
 eric6.QScintilla.Editor.Editor.streamCommentLineOrSelection?4()
@@ -7406,8 +7431,6 @@
 eric6.QScintilla.Exporters.ExporterHTML.ExporterHTML?1(editor, parent=None)
 eric6.QScintilla.Exporters.ExporterHTML.HTMLGenerator.generate?4(tabSize=4, useTabs=False, wysiwyg=True, folding=False, onlyStylesUsed=False, titleFullPath=False)
 eric6.QScintilla.Exporters.ExporterHTML.HTMLGenerator?1(editor)
-eric6.QScintilla.Exporters.ExporterHTML._StrikeThroughExtension.DEL_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._StrikeThroughExtension.extendMarkdown?4(md, md_globals)
 eric6.QScintilla.Exporters.ExporterODT.ExporterODT.exportSource?4()
 eric6.QScintilla.Exporters.ExporterODT.ExporterODT?1(editor, parent=None)
 eric6.QScintilla.Exporters.ExporterPDF.ExporterPDF.exportSource?4()
@@ -8804,11 +8827,22 @@
 eric6.UI.PixmapCache.getSymlinkIcon?4(key, size=None, cache=pixCache)
 eric6.UI.PixmapCache.pixCache?7
 eric6.UI.Previewer.Previewer.hide?4()
+eric6.UI.Previewer.Previewer.preferencesChanged?4()
 eric6.UI.Previewer.Previewer.show?4()
 eric6.UI.Previewer.Previewer.shutdown?4()
 eric6.UI.Previewer.Previewer?1(viewmanager, splitter, parent=None)
+eric6.UI.Previewers.MarkdownExtensions.MermaidExtension.extendMarkdown?4(md, md_globals)
+eric6.UI.Previewers.MarkdownExtensions.MermaidPreprocessor.run?4(lines)
+eric6.UI.Previewers.MarkdownExtensions.MermaidRegex?7
+eric6.UI.Previewers.MarkdownExtensions.MermaidRegexFullText?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.DEL_RE?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.INS_RE?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.MARK_RE?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.SUB_RE?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.SUP_RE?7
+eric6.UI.Previewers.MarkdownExtensions.SimplePatternExtension.extendMarkdown?4(md)
 eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread.htmlReady?7
-eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread.process?4(filePath, language, text, ssiEnabled, rootPath, useSphinx, convertNewLineToBreak, markdownHtmlFormat, restDocutilsHtmlFormat)
+eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread.process?4(filePath, language, text, ssiEnabled, rootPath, useSphinx, convertNewLineToBreak, usePyMdownExtensions, markdownHtmlFormat, restDocutilsHtmlFormat)
 eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread.run?4()
 eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread?1(parent=None)
 eric6.UI.Previewers.PreviewerHTML.PreviewerHTML.on_jsCheckBox_clicked?4(checked)
@@ -8818,8 +8852,8 @@
 eric6.UI.Previewers.PreviewerHTML.PreviewerHTML.resultCallback?4(resDict=resultDict)
 eric6.UI.Previewers.PreviewerHTML.PreviewerHTML.shutdown?4()
 eric6.UI.Previewers.PreviewerHTML.PreviewerHTML?1(parent=None)
-eric6.UI.Previewers.PreviewerHTML._StrikeThroughExtension.DEL_RE?7
-eric6.UI.Previewers.PreviewerHTML._StrikeThroughExtension.extendMarkdown?4(md, md_globals)
+eric6.UI.Previewers.PreviewerHTMLStyles.css_markdown?7
+eric6.UI.Previewers.PreviewerHTMLStyles.css_pygments?7
 eric6.UI.Previewers.PreviewerQSS.PreviewerQSS.processEditor?4(editor=None)
 eric6.UI.Previewers.PreviewerQSS.PreviewerQSS?1(parent=None)
 eric6.UI.PythonAstViewer.PythonAstViewer.EndIndexRole?7
@@ -8867,7 +8901,7 @@
 eric6.UI.UserInterface.Redirector.appendStdout?7
 eric6.UI.UserInterface.Redirector.flush?4()
 eric6.UI.UserInterface.Redirector.write?4(s)
-eric6.UI.UserInterface.Redirector?1(stderr)
+eric6.UI.UserInterface.Redirector?1(stderr, parent=None)
 eric6.UI.UserInterface.UserInterface.BottomSide?7
 eric6.UI.UserInterface.UserInterface.ErrorLogFileName?7
 eric6.UI.UserInterface.UserInterface.LeftSide?7
--- a/eric6/APIs/Python3/eric6.bas	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/APIs/Python3/eric6.bas	Fri Nov 01 16:11:27 2019 +0100
@@ -582,6 +582,8 @@
 MarkdownProvider MarkupBase
 MasterPasswordEntryDialog QDialog Ui_MasterPasswordEntryDialog
 MercurialPage ConfigurationPageBase Ui_MercurialPage
+MermaidExtension Extension
+MermaidPreprocessor Preprocessor
 Message ClbrBaseClasses.Module VisibilityMixin
 MessageBoxWizard QObject
 MessageBoxWizardDialog QDialog Ui_MessageBoxWizardDialog
@@ -721,6 +723,7 @@
 ProtocolHandlerManagerDialog QDialog Ui_ProtocolHandlerManagerDialog
 Purge HgExtension
 PurgeProjectHelper HgExtensionProjectHelper
+PyBoardDevice MicroPythonDevice
 PyCoverageDialog QDialog Ui_PyCoverageDialog
 PyProfile profile.Profile
 PyProfileDialog QDialog Ui_PyProfileDialog
@@ -802,6 +805,7 @@
 ShortcutsDialog QDialog Ui_ShortcutsDialog
 ShortcutsReader XMLStreamReaderBase
 ShortcutsWriter XMLStreamWriterBase
+SimplePatternExtension Extension
 SingleApplicationServer QLocalServer
 SiteInfoDialog QDialog Ui_SiteInfoDialog
 SiteInfoWidget QMenu
@@ -1003,7 +1007,7 @@
 WebBrowserTabBar E5WheelTabBar
 WebBrowserTabWidget E5TabWidget
 WebBrowserView QWebEngineView
-WebBrowserVirusTotalPage ConfigurationPageBase Ui_HelpVirusTotalPage
+WebBrowserVirusTotalPage ConfigurationPageBase Ui_WebBrowserVirusTotalPage
 WebBrowserWebSearchWidget E5ClearableLineEdit
 WebBrowserWindow E5MainWindow
 WebIconDialog QDialog Ui_WebIconDialog
@@ -1024,4 +1028,3 @@
 ZoomManager QObject
 ZoomValuesDialog QDialog Ui_ZoomValuesDialog
 ZoomValuesModel QAbstractTableModel
-_StrikeThroughExtension markdown.Extension
Binary file eric6/Documentation/Help/source.qch has changed
--- a/eric6/Documentation/Help/source.qhp	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Help/source.qhp	Fri Nov 01 16:11:27 2019 +0100
@@ -240,6 +240,7 @@
             <section title="eric6.MicroPython.MicroPythonSerialPort" ref="eric6.MicroPython.MicroPythonSerialPort.html" />
             <section title="eric6.MicroPython.MicroPythonWidget" ref="eric6.MicroPython.MicroPythonWidget.html" />
             <section title="eric6.MicroPython.MicrobitDevices" ref="eric6.MicroPython.MicrobitDevices.html" />
+            <section title="eric6.MicroPython.PyBoardDevices" ref="eric6.MicroPython.PyBoardDevices.html" />
           </section>
           <section title="eric6.MultiProject" ref="index-eric6.MultiProject.html">
             <section title="eric6.MultiProject.AddProjectDialog" ref="eric6.MultiProject.AddProjectDialog.html" />
@@ -287,6 +288,7 @@
             <section title="eric6.Plugins.CheckerPlugins" ref="index-eric6.Plugins.CheckerPlugins.html">
               <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker" ref="index-eric6.Plugins.CheckerPlugins.CodeStyleChecker.html">
                 <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker.html" />
+                <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html" />
                 <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.html" />
                 <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html" />
                 <section title="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html" />
@@ -935,7 +937,9 @@
           </section>
           <section title="eric6.UI" ref="index-eric6.UI.html">
             <section title="eric6.UI.Previewers" ref="index-eric6.UI.Previewers.html">
+              <section title="eric6.UI.Previewers.MarkdownExtensions" ref="eric6.UI.Previewers.MarkdownExtensions.html" />
               <section title="eric6.UI.Previewers.PreviewerHTML" ref="eric6.UI.Previewers.PreviewerHTML.html" />
+              <section title="eric6.UI.Previewers.PreviewerHTMLStyles" ref="eric6.UI.Previewers.PreviewerHTMLStyles.html" />
               <section title="eric6.UI.Previewers.PreviewerQSS" ref="eric6.UI.Previewers.PreviewerQSS.html" />
             </section>
             <section title="eric6.UI.data" ref="index-eric6.UI.data.html">
@@ -1704,6 +1708,7 @@
       <keyword name="AssociationItem.parseAssociationItemDataString" id="AssociationItem.parseAssociationItemDataString" ref="eric6.Graphics.AssociationItem.html#AssociationItem.parseAssociationItemDataString" />
       <keyword name="AssociationItem.unassociate" id="AssociationItem.unassociate" ref="eric6.Graphics.AssociationItem.html#AssociationItem.unassociate" />
       <keyword name="AssociationItem.widgetMoved" id="AssociationItem.widgetMoved" ref="eric6.Graphics.AssociationItem.html#AssociationItem.widgetMoved" />
+      <keyword name="AstUtilities (Module)" id="AstUtilities (Module)" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html" />
       <keyword name="AsyncFile" id="AsyncFile" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile" />
       <keyword name="AsyncFile (Constructor)" id="AsyncFile (Constructor)" ref="eric6.DebugClients.Python.AsyncFile.html#AsyncFile.__init__" />
       <keyword name="AsyncFile (Module)" id="AsyncFile (Module)" ref="eric6.DebugClients.Python.AsyncFile.html" />
@@ -4646,6 +4651,7 @@
       <keyword name="Editor.__checkEncoding" id="Editor.__checkEncoding" ref="eric6.QScintilla.Editor.html#Editor.__checkEncoding" />
       <keyword name="Editor.__checkEol" id="Editor.__checkEol" ref="eric6.QScintilla.Editor.html#Editor.__checkEol" />
       <keyword name="Editor.__checkLanguage" id="Editor.__checkLanguage" ref="eric6.QScintilla.Editor.html#Editor.__checkLanguage" />
+      <keyword name="Editor.__checkSpellLanguage" id="Editor.__checkSpellLanguage" ref="eric6.QScintilla.Editor.html#Editor.__checkSpellLanguage" />
       <keyword name="Editor.__checkSpellingSelection" id="Editor.__checkSpellingSelection" ref="eric6.QScintilla.Editor.html#Editor.__checkSpellingSelection" />
       <keyword name="Editor.__checkSpellingWord" id="Editor.__checkSpellingWord" ref="eric6.QScintilla.Editor.html#Editor.__checkSpellingWord" />
       <keyword name="Editor.__clearBreakpoints" id="Editor.__clearBreakpoints" ref="eric6.QScintilla.Editor.html#Editor.__clearBreakpoints" />
@@ -4697,6 +4703,7 @@
       <keyword name="Editor.__initContextMenuReopenWithEncoding" id="Editor.__initContextMenuReopenWithEncoding" ref="eric6.QScintilla.Editor.html#Editor.__initContextMenuReopenWithEncoding" />
       <keyword name="Editor.__initContextMenuResources" id="Editor.__initContextMenuResources" ref="eric6.QScintilla.Editor.html#Editor.__initContextMenuResources" />
       <keyword name="Editor.__initContextMenuShow" id="Editor.__initContextMenuShow" ref="eric6.QScintilla.Editor.html#Editor.__initContextMenuShow" />
+      <keyword name="Editor.__initContextMenuSpellLanguages" id="Editor.__initContextMenuSpellLanguages" ref="eric6.QScintilla.Editor.html#Editor.__initContextMenuSpellLanguages" />
       <keyword name="Editor.__initContextMenuTools" id="Editor.__initContextMenuTools" ref="eric6.QScintilla.Editor.html#Editor.__initContextMenuTools" />
       <keyword name="Editor.__initOnlineChangeTrace" id="Editor.__initOnlineChangeTrace" ref="eric6.QScintilla.Editor.html#Editor.__initOnlineChangeTrace" />
       <keyword name="Editor.__initOnlineSyntaxCheck" id="Editor.__initOnlineSyntaxCheck" ref="eric6.QScintilla.Editor.html#Editor.__initOnlineSyntaxCheck" />
@@ -4754,6 +4761,7 @@
       <keyword name="Editor.__setAutoCompletion" id="Editor.__setAutoCompletion" ref="eric6.QScintilla.Editor.html#Editor.__setAutoCompletion" />
       <keyword name="Editor.__setCallTips" id="Editor.__setCallTips" ref="eric6.QScintilla.Editor.html#Editor.__setCallTips" />
       <keyword name="Editor.__setEolMode" id="Editor.__setEolMode" ref="eric6.QScintilla.Editor.html#Editor.__setEolMode" />
+      <keyword name="Editor.__setFileName" id="Editor.__setFileName" ref="eric6.QScintilla.Editor.html#Editor.__setFileName" />
       <keyword name="Editor.__setLineMarkerColours" id="Editor.__setLineMarkerColours" ref="eric6.QScintilla.Editor.html#Editor.__setLineMarkerColours" />
       <keyword name="Editor.__setMarginsDisplay" id="Editor.__setMarginsDisplay" ref="eric6.QScintilla.Editor.html#Editor.__setMarginsDisplay" />
       <keyword name="Editor.__setSpelling" id="Editor.__setSpelling" ref="eric6.QScintilla.Editor.html#Editor.__setSpelling" />
@@ -4776,6 +4784,7 @@
       <keyword name="Editor.__showContextMenuMargin" id="Editor.__showContextMenuMargin" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuMargin" />
       <keyword name="Editor.__showContextMenuResources" id="Editor.__showContextMenuResources" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuResources" />
       <keyword name="Editor.__showContextMenuShow" id="Editor.__showContextMenuShow" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuShow" />
+      <keyword name="Editor.__showContextMenuSpellLanguages" id="Editor.__showContextMenuSpellLanguages" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuSpellLanguages" />
       <keyword name="Editor.__showContextMenuSpelling" id="Editor.__showContextMenuSpelling" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuSpelling" />
       <keyword name="Editor.__showContextMenuTools" id="Editor.__showContextMenuTools" ref="eric6.QScintilla.Editor.html#Editor.__showContextMenuTools" />
       <keyword name="Editor.__showImportsDiagram" id="Editor.__showImportsDiagram" ref="eric6.QScintilla.Editor.html#Editor.__showImportsDiagram" />
@@ -4784,6 +4793,8 @@
       <keyword name="Editor.__showSyntaxError" id="Editor.__showSyntaxError" ref="eric6.QScintilla.Editor.html#Editor.__showSyntaxError" />
       <keyword name="Editor.__showWarning" id="Editor.__showWarning" ref="eric6.QScintilla.Editor.html#Editor.__showWarning" />
       <keyword name="Editor.__spellCharAdded" id="Editor.__spellCharAdded" ref="eric6.QScintilla.Editor.html#Editor.__spellCharAdded" />
+      <keyword name="Editor.__spellLanguageChanged" id="Editor.__spellLanguageChanged" ref="eric6.QScintilla.Editor.html#Editor.__spellLanguageChanged" />
+      <keyword name="Editor.__spellLanguagesMenuTriggered" id="Editor.__spellLanguagesMenuTriggered" ref="eric6.QScintilla.Editor.html#Editor.__spellLanguagesMenuTriggered" />
       <keyword name="Editor.__styleNeeded" id="Editor.__styleNeeded" ref="eric6.QScintilla.Editor.html#Editor.__styleNeeded" />
       <keyword name="Editor.__textChanged" id="Editor.__textChanged" ref="eric6.QScintilla.Editor.html#Editor.__textChanged" />
       <keyword name="Editor.__toggleAutoCompletionEnable" id="Editor.__toggleAutoCompletionEnable" ref="eric6.QScintilla.Editor.html#Editor.__toggleAutoCompletionEnable" />
@@ -4871,6 +4882,7 @@
       <keyword name="Editor.getSearchIndicatorLines" id="Editor.getSearchIndicatorLines" ref="eric6.QScintilla.Editor.html#Editor.getSearchIndicatorLines" />
       <keyword name="Editor.getSearchText" id="Editor.getSearchText" ref="eric6.QScintilla.Editor.html#Editor.getSearchText" />
       <keyword name="Editor.getSharingStatus" id="Editor.getSharingStatus" ref="eric6.QScintilla.Editor.html#Editor.getSharingStatus" />
+      <keyword name="Editor.getSpellingLanguage" id="Editor.getSpellingLanguage" ref="eric6.QScintilla.Editor.html#Editor.getSpellingLanguage" />
       <keyword name="Editor.getSyntaxErrorLines" id="Editor.getSyntaxErrorLines" ref="eric6.QScintilla.Editor.html#Editor.getSyntaxErrorLines" />
       <keyword name="Editor.getSyntaxErrors" id="Editor.getSyntaxErrors" ref="eric6.QScintilla.Editor.html#Editor.getSyntaxErrors" />
       <keyword name="Editor.getTaskLines" id="Editor.getTaskLines" ref="eric6.QScintilla.Editor.html#Editor.getTaskLines" />
@@ -5079,6 +5091,7 @@
       <keyword name="EditorFilePage.on_editFileFilterButton_clicked" id="EditorFilePage.on_editFileFilterButton_clicked" ref="eric6.Preferences.ConfigurationPages.EditorFilePage.html#EditorFilePage.on_editFileFilterButton_clicked" />
       <keyword name="EditorFilePage.on_fileFiltersList_currentItemChanged" id="EditorFilePage.on_fileFiltersList_currentItemChanged" ref="eric6.Preferences.ConfigurationPages.EditorFilePage.html#EditorFilePage.on_fileFiltersList_currentItemChanged" />
       <keyword name="EditorFilePage.on_openFiltersButton_toggled" id="EditorFilePage.on_openFiltersButton_toggled" ref="eric6.Preferences.ConfigurationPages.EditorFilePage.html#EditorFilePage.on_openFiltersButton_toggled" />
+      <keyword name="EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked" id="EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked" ref="eric6.Preferences.ConfigurationPages.EditorFilePage.html#EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked" />
       <keyword name="EditorFilePage.save" id="EditorFilePage.save" ref="eric6.Preferences.ConfigurationPages.EditorFilePage.html#EditorFilePage.save" />
       <keyword name="EditorGeneralPage" id="EditorGeneralPage" ref="eric6.Preferences.ConfigurationPages.EditorGeneralPage.html#EditorGeneralPage" />
       <keyword name="EditorGeneralPage (Constructor)" id="EditorGeneralPage (Constructor)" ref="eric6.Preferences.ConfigurationPages.EditorGeneralPage.html#EditorGeneralPage.__init__" />
@@ -9491,6 +9504,7 @@
       <keyword name="ManageDictionariesDialog.on_dictionariesList_itemSelectionChanged" id="ManageDictionariesDialog.on_dictionariesList_itemSelectionChanged" ref="eric6.WebBrowser.SpellCheck.ManageDictionariesDialog.html#ManageDictionariesDialog.on_dictionariesList_itemSelectionChanged" />
       <keyword name="ManageDictionariesDialog.on_dictionariesUrlEditButton_toggled" id="ManageDictionariesDialog.on_dictionariesUrlEditButton_toggled" ref="eric6.WebBrowser.SpellCheck.ManageDictionariesDialog.html#ManageDictionariesDialog.on_dictionariesUrlEditButton_toggled" />
       <keyword name="ManageDictionariesDialog.on_locationComboBox_currentTextChanged" id="ManageDictionariesDialog.on_locationComboBox_currentTextChanged" ref="eric6.WebBrowser.SpellCheck.ManageDictionariesDialog.html#ManageDictionariesDialog.on_locationComboBox_currentTextChanged" />
+      <keyword name="MarkdownExtensions (Module)" id="MarkdownExtensions (Module)" ref="eric6.UI.Previewers.MarkdownExtensions.html" />
       <keyword name="MarkdownProvider" id="MarkdownProvider" ref="eric6.QScintilla.MarkupProviders.MarkdownProvider.html#MarkdownProvider" />
       <keyword name="MarkdownProvider (Constructor)" id="MarkdownProvider (Constructor)" ref="eric6.QScintilla.MarkupProviders.MarkdownProvider.html#MarkdownProvider.__init__" />
       <keyword name="MarkdownProvider (Module)" id="MarkdownProvider (Module)" ref="eric6.QScintilla.MarkupProviders.MarkdownProvider.html" />
@@ -9564,6 +9578,10 @@
       <keyword name="MercurialPage (Module)" id="MercurialPage (Module)" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html" />
       <keyword name="MercurialPage.on_configButton_clicked" id="MercurialPage.on_configButton_clicked" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.on_configButton_clicked" />
       <keyword name="MercurialPage.save" id="MercurialPage.save" ref="eric6.Plugins.VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage.html#MercurialPage.save" />
+      <keyword name="MermaidExtension" id="MermaidExtension" ref="eric6.UI.Previewers.MarkdownExtensions.html#MermaidExtension" />
+      <keyword name="MermaidExtension.extendMarkdown" id="MermaidExtension.extendMarkdown" ref="eric6.UI.Previewers.MarkdownExtensions.html#MermaidExtension.extendMarkdown" />
+      <keyword name="MermaidPreprocessor" id="MermaidPreprocessor" ref="eric6.UI.Previewers.MarkdownExtensions.html#MermaidPreprocessor" />
+      <keyword name="MermaidPreprocessor.run" id="MermaidPreprocessor.run" ref="eric6.UI.Previewers.MarkdownExtensions.html#MermaidPreprocessor.run" />
       <keyword name="Message" id="Message" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message" />
       <keyword name="Message (Constructor)" id="Message (Constructor)" ref="eric6.Utilities.ClassBrowsers.protoclbr.html#Message.__init__" />
       <keyword name="MessageBoxWizard" id="MessageBoxWizard" ref="eric6.Plugins.PluginWizardQMessageBox.html#MessageBoxWizard" />
@@ -9772,12 +9790,10 @@
       <keyword name="MicroPythonWidget.setActionButtons" id="MicroPythonWidget.setActionButtons" ref="eric6.MicroPython.MicroPythonWidget.html#MicroPythonWidget.setActionButtons" />
       <keyword name="MicrobitDevice" id="MicrobitDevice" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice" />
       <keyword name="MicrobitDevice (Constructor)" id="MicrobitDevice (Constructor)" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__init__" />
-      <keyword name="MicrobitDevice.__flashCustomMicroPython" id="MicrobitDevice.__flashCustomMicroPython" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__flashCustomMicroPython" />
       <keyword name="MicrobitDevice.__flashMicroPython" id="MicrobitDevice.__flashMicroPython" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__flashMicroPython" />
-      <keyword name="MicrobitDevice.__flashScript" id="MicrobitDevice.__flashScript" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__flashScript" />
-      <keyword name="MicrobitDevice.__installUflashTool" id="MicrobitDevice.__installUflashTool" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__installUflashTool" />
       <keyword name="MicrobitDevice.__resetDevice" id="MicrobitDevice.__resetDevice" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__resetDevice" />
       <keyword name="MicrobitDevice.__saveMain" id="MicrobitDevice.__saveMain" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__saveMain" />
+      <keyword name="MicrobitDevice.__saveScriptToDevice" id="MicrobitDevice.__saveScriptToDevice" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.__saveScriptToDevice" />
       <keyword name="MicrobitDevice.addDeviceMenuEntries" id="MicrobitDevice.addDeviceMenuEntries" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.addDeviceMenuEntries" />
       <keyword name="MicrobitDevice.canRunScript" id="MicrobitDevice.canRunScript" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.canRunScript" />
       <keyword name="MicrobitDevice.canStartFileManager" id="MicrobitDevice.canStartFileManager" ref="eric6.MicroPython.MicrobitDevices.html#MicrobitDevice.canStartFileManager" />
@@ -11027,6 +11043,7 @@
       <keyword name="Previewer.__processEditor" id="Previewer.__processEditor" ref="eric6.UI.Previewer.html#Previewer.__processEditor" />
       <keyword name="Previewer.__splitterMoved" id="Previewer.__splitterMoved" ref="eric6.UI.Previewer.html#Previewer.__splitterMoved" />
       <keyword name="Previewer.hide" id="Previewer.hide" ref="eric6.UI.Previewer.html#Previewer.hide" />
+      <keyword name="Previewer.preferencesChanged" id="Previewer.preferencesChanged" ref="eric6.UI.Previewer.html#Previewer.preferencesChanged" />
       <keyword name="Previewer.show" id="Previewer.show" ref="eric6.UI.Previewer.html#Previewer.show" />
       <keyword name="Previewer.shutdown" id="Previewer.shutdown" ref="eric6.UI.Previewer.html#Previewer.shutdown" />
       <keyword name="PreviewerHTML" id="PreviewerHTML" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewerHTML" />
@@ -11044,6 +11061,7 @@
       <keyword name="PreviewerHTML.processEditor" id="PreviewerHTML.processEditor" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewerHTML.processEditor" />
       <keyword name="PreviewerHTML.resultCallback" id="PreviewerHTML.resultCallback" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewerHTML.resultCallback" />
       <keyword name="PreviewerHTML.shutdown" id="PreviewerHTML.shutdown" ref="eric6.UI.Previewers.PreviewerHTML.html#PreviewerHTML.shutdown" />
+      <keyword name="PreviewerHTMLStyles (Module)" id="PreviewerHTMLStyles (Module)" ref="eric6.UI.Previewers.PreviewerHTMLStyles.html" />
       <keyword name="PreviewerQSS" id="PreviewerQSS" ref="eric6.UI.Previewers.PreviewerQSS.html#PreviewerQSS" />
       <keyword name="PreviewerQSS (Constructor)" id="PreviewerQSS (Constructor)" ref="eric6.UI.Previewers.PreviewerQSS.html#PreviewerQSS.__init__" />
       <keyword name="PreviewerQSS (Module)" id="PreviewerQSS (Module)" ref="eric6.UI.Previewers.PreviewerQSS.html" />
@@ -11698,6 +11716,23 @@
       <keyword name="PurgeProjectHelper.initActions" id="PurgeProjectHelper.initActions" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.html#PurgeProjectHelper.initActions" />
       <keyword name="PurgeProjectHelper.initMenu" id="PurgeProjectHelper.initMenu" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.html#PurgeProjectHelper.initMenu" />
       <keyword name="PurgeProjectHelper.menuTitle" id="PurgeProjectHelper.menuTitle" ref="eric6.Plugins.VcsPlugins.vcsMercurial.PurgeExtension.ProjectHelper.html#PurgeProjectHelper.menuTitle" />
+      <keyword name="PyBoardDevice" id="PyBoardDevice" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice" />
+      <keyword name="PyBoardDevice (Constructor)" id="PyBoardDevice (Constructor)" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.__init__" />
+      <keyword name="PyBoardDevice.__deviceVolumeMounted" id="PyBoardDevice.__deviceVolumeMounted" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.__deviceVolumeMounted" />
+      <keyword name="PyBoardDevice.__showInstallInstructions" id="PyBoardDevice.__showInstallInstructions" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.__showInstallInstructions" />
+      <keyword name="PyBoardDevice.addDeviceMenuEntries" id="PyBoardDevice.addDeviceMenuEntries" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.addDeviceMenuEntries" />
+      <keyword name="PyBoardDevice.canRunScript" id="PyBoardDevice.canRunScript" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.canRunScript" />
+      <keyword name="PyBoardDevice.canStartFileManager" id="PyBoardDevice.canStartFileManager" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.canStartFileManager" />
+      <keyword name="PyBoardDevice.canStartPlotter" id="PyBoardDevice.canStartPlotter" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.canStartPlotter" />
+      <keyword name="PyBoardDevice.canStartRepl" id="PyBoardDevice.canStartRepl" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.canStartRepl" />
+      <keyword name="PyBoardDevice.deviceName" id="PyBoardDevice.deviceName" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.deviceName" />
+      <keyword name="PyBoardDevice.forceInterrupt" id="PyBoardDevice.forceInterrupt" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.forceInterrupt" />
+      <keyword name="PyBoardDevice.getDocumentationUrl" id="PyBoardDevice.getDocumentationUrl" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.getDocumentationUrl" />
+      <keyword name="PyBoardDevice.getWorkspace" id="PyBoardDevice.getWorkspace" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.getWorkspace" />
+      <keyword name="PyBoardDevice.runScript" id="PyBoardDevice.runScript" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.runScript" />
+      <keyword name="PyBoardDevice.setButtons" id="PyBoardDevice.setButtons" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.setButtons" />
+      <keyword name="PyBoardDevice.supportsLocalFileAccess" id="PyBoardDevice.supportsLocalFileAccess" ref="eric6.MicroPython.PyBoardDevices.html#PyBoardDevice.supportsLocalFileAccess" />
+      <keyword name="PyBoardDevices (Module)" id="PyBoardDevices (Module)" ref="eric6.MicroPython.PyBoardDevices.html" />
       <keyword name="PyCoverageDialog" id="PyCoverageDialog" ref="eric6.DataViews.PyCoverageDialog.html#PyCoverageDialog" />
       <keyword name="PyCoverageDialog (Constructor)" id="PyCoverageDialog (Constructor)" ref="eric6.DataViews.PyCoverageDialog.html#PyCoverageDialog.__init__" />
       <keyword name="PyCoverageDialog (Module)" id="PyCoverageDialog (Module)" ref="eric6.DataViews.PyCoverageDialog.html" />
@@ -12963,6 +12998,8 @@
       <keyword name="ShortcutsWriter (Module)" id="ShortcutsWriter (Module)" ref="eric6.E5XML.ShortcutsWriter.html" />
       <keyword name="ShortcutsWriter.__writeActions" id="ShortcutsWriter.__writeActions" ref="eric6.E5XML.ShortcutsWriter.html#ShortcutsWriter.__writeActions" />
       <keyword name="ShortcutsWriter.writeXML" id="ShortcutsWriter.writeXML" ref="eric6.E5XML.ShortcutsWriter.html#ShortcutsWriter.writeXML" />
+      <keyword name="SimplePatternExtension" id="SimplePatternExtension" ref="eric6.UI.Previewers.MarkdownExtensions.html#SimplePatternExtension" />
+      <keyword name="SimplePatternExtension.extendMarkdown" id="SimplePatternExtension.extendMarkdown" ref="eric6.UI.Previewers.MarkdownExtensions.html#SimplePatternExtension.extendMarkdown" />
       <keyword name="SingleApplication (Module)" id="SingleApplication (Module)" ref="eric6.Toolbox.SingleApplication.html" />
       <keyword name="SingleApplicationClient" id="SingleApplicationClient" ref="eric6.Toolbox.SingleApplication.html#SingleApplicationClient" />
       <keyword name="SingleApplicationClient (Constructor)" id="SingleApplicationClient (Constructor)" ref="eric6.Toolbox.SingleApplication.html#SingleApplicationClient.__init__" />
@@ -14713,13 +14750,13 @@
       <keyword name="TextVisitor" id="TextVisitor" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor" />
       <keyword name="TextVisitor (Constructor)" id="TextVisitor (Constructor)" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.__init__" />
       <keyword name="TextVisitor.__addNode" id="TextVisitor.__addNode" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.__addNode" />
-      <keyword name="TextVisitor.__isBaseString" id="TextVisitor.__isBaseString" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.__isBaseString" />
       <keyword name="TextVisitor.__visitBody" id="TextVisitor.__visitBody" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.__visitBody" />
       <keyword name="TextVisitor.__visitDefinition" id="TextVisitor.__visitDefinition" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.__visitDefinition" />
       <keyword name="TextVisitor.visit_AsyncFunctionDef" id="TextVisitor.visit_AsyncFunctionDef" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_AsyncFunctionDef" />
       <keyword name="TextVisitor.visit_Bytes" id="TextVisitor.visit_Bytes" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_Bytes" />
       <keyword name="TextVisitor.visit_Call" id="TextVisitor.visit_Call" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_Call" />
       <keyword name="TextVisitor.visit_ClassDef" id="TextVisitor.visit_ClassDef" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_ClassDef" />
+      <keyword name="TextVisitor.visit_Constant" id="TextVisitor.visit_Constant" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_Constant" />
       <keyword name="TextVisitor.visit_FunctionDef" id="TextVisitor.visit_FunctionDef" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_FunctionDef" />
       <keyword name="TextVisitor.visit_Module" id="TextVisitor.visit_Module" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_Module" />
       <keyword name="TextVisitor.visit_Str" id="TextVisitor.visit_Str" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html#TextVisitor.visit_Str" />
@@ -16866,10 +16903,6 @@
       <keyword name="_ClbrBase" id="_ClbrBase" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#_ClbrBase" />
       <keyword name="_ClbrBase (Constructor)" id="_ClbrBase (Constructor)" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#_ClbrBase.__init__" />
       <keyword name="_ClbrBase.setEndLine" id="_ClbrBase.setEndLine" ref="eric6.Utilities.ClassBrowsers.ClbrBaseClasses.html#_ClbrBase.setEndLine" />
-      <keyword name="_StrikeThroughExtension" id="_StrikeThroughExtension" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_StrikeThroughExtension" />
-      <keyword name="_StrikeThroughExtension" id="_StrikeThroughExtension" ref="eric6.UI.Previewers.PreviewerHTML.html#_StrikeThroughExtension" />
-      <keyword name="_StrikeThroughExtension.extendMarkdown" id="_StrikeThroughExtension.extendMarkdown" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_StrikeThroughExtension.extendMarkdown" />
-      <keyword name="_StrikeThroughExtension.extendMarkdown" id="_StrikeThroughExtension.extendMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#_StrikeThroughExtension.extendMarkdown" />
       <keyword name="__check" id="__check" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#__check" />
       <keyword name="__checkCodeStyle" id="__checkCodeStyle" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html#__checkCodeStyle" />
       <keyword name="__getMasterPassword" id="__getMasterPassword" ref="eric6.Utilities.crypto.__init__.html#__getMasterPassword" />
@@ -17318,6 +17351,8 @@
       <keyword name="getUser" id="getUser" ref="eric6.Preferences.__init__.html#getUser" />
       <keyword name="getUserName" id="getUserName" ref="eric6.Utilities.__init__.html#getUserName" />
       <keyword name="getVCS" id="getVCS" ref="eric6.Preferences.__init__.html#getVCS" />
+      <keyword name="getValue" id="getValue" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#getValue" />
+      <keyword name="getValue_1" id="getValue_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#getValue_1" />
       <keyword name="getVarFilters" id="getVarFilters" ref="eric6.Preferences.__init__.html#getVarFilters" />
       <keyword name="getVcsSystemIndicator" id="getVcsSystemIndicator" ref="eric6.Plugins.PluginVcsGit.html#getVcsSystemIndicator" />
       <keyword name="getVcsSystemIndicator" id="getVcsSystemIndicator" ref="eric6.Plugins.PluginVcsMercurial.html#getVcsSystemIndicator" />
@@ -17392,6 +17427,10 @@
       <keyword name="instance" id="instance" ref="eric6.WebBrowser.ZoomManager.ZoomManager.html#instance" />
       <keyword name="ircFilter" id="ircFilter" ref="eric6.Network.IRC.IrcUtilities.html#ircFilter" />
       <keyword name="ircTimestamp" id="ircTimestamp" ref="eric6.Network.IRC.IrcUtilities.html#ircTimestamp" />
+      <keyword name="isBaseString" id="isBaseString" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isBaseString" />
+      <keyword name="isBaseString_1" id="isBaseString_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isBaseString_1" />
+      <keyword name="isBytes" id="isBytes" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isBytes" />
+      <keyword name="isBytes_1" id="isBytes_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isBytes_1" />
       <keyword name="isClientSecretFileAvailable" id="isClientSecretFileAvailable" ref="eric6.E5Network.E5GoogleMailHelpers.html#isClientSecretFileAvailable" />
       <keyword name="isCondaAvailable" id="isCondaAvailable" ref="eric6.CondaInterface.__init__.html#isCondaAvailable" />
       <keyword name="isConfigured" id="isConfigured" ref="eric6.Preferences.__init__.html#isConfigured" />
@@ -17402,6 +17441,12 @@
       <keyword name="isKdeDesktop" id="isKdeDesktop" ref="eric6.Globals.__init__.html#isKdeDesktop" />
       <keyword name="isLinuxPlatform" id="isLinuxPlatform" ref="eric6.Globals.__init__.html#isLinuxPlatform" />
       <keyword name="isMacPlatform" id="isMacPlatform" ref="eric6.Globals.__init__.html#isMacPlatform" />
+      <keyword name="isNameConstant" id="isNameConstant" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNameConstant" />
+      <keyword name="isNameConstant_1" id="isNameConstant_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNameConstant_1" />
+      <keyword name="isNumber" id="isNumber" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNumber" />
+      <keyword name="isNumber_1" id="isNumber_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isNumber_1" />
+      <keyword name="isString" id="isString" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isString" />
+      <keyword name="isString_1" id="isString_1" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html#isString_1" />
       <keyword name="isTextFile" id="isTextFile" ref="eric6.Utilities.MimeTypes.html#isTextFile" />
       <keyword name="isValidAddress" id="isValidAddress" ref="eric6.E5Network.__init__.html#isValidAddress" />
       <keyword name="isValidIPv4Address" id="isValidIPv4Address" ref="eric6.E5Network.__init__.html#isValidIPv4Address" />
@@ -17958,6 +18003,7 @@
       <file>eric6.MicroPython.MicroPythonSerialPort.html</file>
       <file>eric6.MicroPython.MicroPythonWidget.html</file>
       <file>eric6.MicroPython.MicrobitDevices.html</file>
+      <file>eric6.MicroPython.PyBoardDevices.html</file>
       <file>eric6.MultiProject.AddProjectDialog.html</file>
       <file>eric6.MultiProject.MultiProject.html</file>
       <file>eric6.MultiProject.MultiProjectBrowser.html</file>
@@ -17989,6 +18035,7 @@
       <file>eric6.PluginManager.PluginUninstallDialog.html</file>
       <file>eric6.Plugins.AboutPlugin.AboutDialog.html</file>
       <file>eric6.Plugins.CheckerPlugins.CodeStyleChecker.AnnotationsChecker.html</file>
+      <file>eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html</file>
       <file>eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.html</file>
       <file>eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleChecker.html</file>
       <file>eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html</file>
@@ -18536,7 +18583,9 @@
       <file>eric6.UI.NumbersWidget.html</file>
       <file>eric6.UI.PixmapCache.html</file>
       <file>eric6.UI.Previewer.html</file>
+      <file>eric6.UI.Previewers.MarkdownExtensions.html</file>
       <file>eric6.UI.Previewers.PreviewerHTML.html</file>
+      <file>eric6.UI.Previewers.PreviewerHTMLStyles.html</file>
       <file>eric6.UI.Previewers.PreviewerQSS.html</file>
       <file>eric6.UI.PythonAstViewer.html</file>
       <file>eric6.UI.SearchWidget.html</file>
--- a/eric6/Documentation/Source/eric6.MicroPython.MicrobitDevices.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.MicroPython.MicrobitDevices.html	Fri Nov 01 16:11:27 2019 +0100
@@ -73,22 +73,10 @@
 <td>Constructor</td>
 </tr>
 <tr>
-<td><a href="#MicrobitDevice.__flashCustomMicroPython">__flashCustomMicroPython</a></td>
-<td>Private slot to flash a custom MicroPython firmware to the device.</td>
-</tr>
-<tr>
 <td><a href="#MicrobitDevice.__flashMicroPython">__flashMicroPython</a></td>
 <td>Private slot to flash the default MicroPython firmware to the device.</td>
 </tr>
 <tr>
-<td><a href="#MicrobitDevice.__flashScript">__flashScript</a></td>
-<td>Private slot to flash the current script onto the selected device.</td>
-</tr>
-<tr>
-<td><a href="#MicrobitDevice.__installUflashTool">__installUflashTool</a></td>
-<td>Private slot to install the uflash package via pip.</td>
-</tr>
-<tr>
 <td><a href="#MicrobitDevice.__resetDevice">__resetDevice</a></td>
 <td>Private slot to reset the connected device.</td>
 </tr>
@@ -97,6 +85,10 @@
 <td>Private slot to copy the current script as 'main.py' onto the connected device.</td>
 </tr>
 <tr>
+<td><a href="#MicrobitDevice.__saveScriptToDevice">__saveScriptToDevice</a></td>
+<td>Private method to save the current script onto the connected device.</td>
+</tr>
+<tr>
 <td><a href="#MicrobitDevice.addDeviceMenuEntries">addDeviceMenuEntries</a></td>
 <td>Public method to add device specific entries to the given menu.</td>
 </tr>
@@ -169,13 +161,6 @@
 reference to the parent object
 </dd>
 </dl>
-<a NAME="MicrobitDevice.__flashCustomMicroPython" ID="MicrobitDevice.__flashCustomMicroPython"></a>
-<h4>MicrobitDevice.__flashCustomMicroPython</h4>
-<b>__flashCustomMicroPython</b>(<i></i>)
-
-<p>
-        Private slot to flash a custom MicroPython firmware to the device.
-</p>
 <a NAME="MicrobitDevice.__flashMicroPython" ID="MicrobitDevice.__flashMicroPython"></a>
 <h4>MicrobitDevice.__flashMicroPython</h4>
 <b>__flashMicroPython</b>(<i></i>)
@@ -183,20 +168,6 @@
 <p>
         Private slot to flash the default MicroPython firmware to the device.
 </p>
-<a NAME="MicrobitDevice.__flashScript" ID="MicrobitDevice.__flashScript"></a>
-<h4>MicrobitDevice.__flashScript</h4>
-<b>__flashScript</b>(<i></i>)
-
-<p>
-        Private slot to flash the current script onto the selected device.
-</p>
-<a NAME="MicrobitDevice.__installUflashTool" ID="MicrobitDevice.__installUflashTool"></a>
-<h4>MicrobitDevice.__installUflashTool</h4>
-<b>__installUflashTool</b>(<i></i>)
-
-<p>
-        Private slot to install the uflash package via pip.
-</p>
 <a NAME="MicrobitDevice.__resetDevice" ID="MicrobitDevice.__resetDevice"></a>
 <h4>MicrobitDevice.__resetDevice</h4>
 <b>__resetDevice</b>(<i></i>)
@@ -212,6 +183,21 @@
         Private slot to copy the current script as 'main.py' onto the
         connected device.
 </p>
+<a NAME="MicrobitDevice.__saveScriptToDevice" ID="MicrobitDevice.__saveScriptToDevice"></a>
+<h4>MicrobitDevice.__saveScriptToDevice</h4>
+<b>__saveScriptToDevice</b>(<i>scriptName=""</i>)
+
+<p>
+        Private method to save the current script onto the connected
+        device.
+</p>
+<dl>
+
+<dt><i>scriptName</i> (str)</dt>
+<dd>
+name of the file on the device
+</dd>
+</dl>
 <a NAME="MicrobitDevice.addDeviceMenuEntries" ID="MicrobitDevice.addDeviceMenuEntries"></a>
 <h4>MicrobitDevice.addDeviceMenuEntries</h4>
 <b>addDeviceMenuEntries</b>(<i>menu</i>)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/eric6.MicroPython.PyBoardDevices.html	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,403 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.MicroPython.PyBoardDevices</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric6.MicroPython.PyBoardDevices</h1>
+
+<p>
+Module implementing the device interface class for PyBoard boards.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#PyBoardDevice">PyBoardDevice</a></td>
+<td>Class implementing the device for PyBoard boards.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="PyBoardDevice" ID="PyBoardDevice"></a>
+<h2>PyBoardDevice</h2>
+
+<p>
+    Class implementing the device for PyBoard boards.
+</p>
+<h3>Derived from</h3>
+MicroPythonDevice
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>DeviceVolumeName</td></tr><tr><td>FlashInstructionsURL</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#PyBoardDevice.__init__">PyBoardDevice</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.__deviceVolumeMounted">__deviceVolumeMounted</a></td>
+<td>Private method to check, if the device volume is mounted.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.__showInstallInstructions">__showInstallInstructions</a></td>
+<td>Private slot to open the URL containing instructions for installing MicroPython on the pyboard.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.addDeviceMenuEntries">addDeviceMenuEntries</a></td>
+<td>Public method to add device specific entries to the given menu.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.canRunScript">canRunScript</a></td>
+<td>Public method to determine, if a script can be executed.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.canStartFileManager">canStartFileManager</a></td>
+<td>Public method to determine, if a File Manager can be started.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.canStartPlotter">canStartPlotter</a></td>
+<td>Public method to determine, if a Plotter can be started.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.canStartRepl">canStartRepl</a></td>
+<td>Public method to determine, if a REPL can be started.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.deviceName">deviceName</a></td>
+<td>Public method to get the name of the device.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.forceInterrupt">forceInterrupt</a></td>
+<td>Public method to determine the need for an interrupt when opening the serial connection.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.getDocumentationUrl">getDocumentationUrl</a></td>
+<td>Public method to get the device documentation URL.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.getWorkspace">getWorkspace</a></td>
+<td>Public method to get the workspace directory.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.runScript">runScript</a></td>
+<td>Public method to run the given Python script.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.setButtons">setButtons</a></td>
+<td>Public method to enable the supported action buttons.</td>
+</tr>
+<tr>
+<td><a href="#PyBoardDevice.supportsLocalFileAccess">supportsLocalFileAccess</a></td>
+<td>Public method to indicate file access via a local directory.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="PyBoardDevice.__init__" ID="PyBoardDevice.__init__"></a>
+<h4>PyBoardDevice (Constructor)</h4>
+<b>PyBoardDevice</b>(<i>microPythonWidget, parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>microPythonWidget</i> (MicroPythonWidget)</dt>
+<dd>
+reference to the main MicroPython widget
+</dd>
+<dt><i>parent</i> (QObject)</dt>
+<dd>
+reference to the parent object
+</dd>
+</dl>
+<a NAME="PyBoardDevice.__deviceVolumeMounted" ID="PyBoardDevice.__deviceVolumeMounted"></a>
+<h4>PyBoardDevice.__deviceVolumeMounted</h4>
+<b>__deviceVolumeMounted</b>(<i></i>)
+
+<p>
+        Private method to check, if the device volume is mounted.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicated a mounted device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<a NAME="PyBoardDevice.__showInstallInstructions" ID="PyBoardDevice.__showInstallInstructions"></a>
+<h4>PyBoardDevice.__showInstallInstructions</h4>
+<b>__showInstallInstructions</b>(<i></i>)
+
+<p>
+        Private slot to open the URL containing instructions for installing
+        MicroPython on the pyboard.
+</p>
+<a NAME="PyBoardDevice.addDeviceMenuEntries" ID="PyBoardDevice.addDeviceMenuEntries"></a>
+<h4>PyBoardDevice.addDeviceMenuEntries</h4>
+<b>addDeviceMenuEntries</b>(<i>menu</i>)
+
+<p>
+        Public method to add device specific entries to the given menu.
+</p>
+<dl>
+
+<dt><i>menu</i> (QMenu)</dt>
+<dd>
+reference to the context menu
+</dd>
+</dl>
+<a NAME="PyBoardDevice.canRunScript" ID="PyBoardDevice.canRunScript"></a>
+<h4>PyBoardDevice.canRunScript</h4>
+<b>canRunScript</b>(<i></i>)
+
+<p>
+        Public method to determine, if a script can be executed.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a flag indicating it is safe to start a
+            Plotter and a reason why it cannot.
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="PyBoardDevice.canStartFileManager" ID="PyBoardDevice.canStartFileManager"></a>
+<h4>PyBoardDevice.canStartFileManager</h4>
+<b>canStartFileManager</b>(<i></i>)
+
+<p>
+        Public method to determine, if a File Manager can be started.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a flag indicating it is safe to start a
+            File Manager and a reason why it cannot.
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="PyBoardDevice.canStartPlotter" ID="PyBoardDevice.canStartPlotter"></a>
+<h4>PyBoardDevice.canStartPlotter</h4>
+<b>canStartPlotter</b>(<i></i>)
+
+<p>
+        Public method to determine, if a Plotter can be started.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a flag indicating it is safe to start a
+            Plotter and a reason why it cannot.
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="PyBoardDevice.canStartRepl" ID="PyBoardDevice.canStartRepl"></a>
+<h4>PyBoardDevice.canStartRepl</h4>
+<b>canStartRepl</b>(<i></i>)
+
+<p>
+        Public method to determine, if a REPL can be started.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing a flag indicating it is safe to start a REPL
+            and a reason why it cannot.
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="PyBoardDevice.deviceName" ID="PyBoardDevice.deviceName"></a>
+<h4>PyBoardDevice.deviceName</h4>
+<b>deviceName</b>(<i></i>)
+
+<p>
+        Public method to get the name of the device.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+name of the device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<a NAME="PyBoardDevice.forceInterrupt" ID="PyBoardDevice.forceInterrupt"></a>
+<h4>PyBoardDevice.forceInterrupt</h4>
+<b>forceInterrupt</b>(<i></i>)
+
+<p>
+        Public method to determine the need for an interrupt when opening the
+        serial connection.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating an interrupt is needed
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<a NAME="PyBoardDevice.getDocumentationUrl" ID="PyBoardDevice.getDocumentationUrl"></a>
+<h4>PyBoardDevice.getDocumentationUrl</h4>
+<b>getDocumentationUrl</b>(<i></i>)
+
+<p>
+        Public method to get the device documentation URL.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+documentation URL of the device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<a NAME="PyBoardDevice.getWorkspace" ID="PyBoardDevice.getWorkspace"></a>
+<h4>PyBoardDevice.getWorkspace</h4>
+<b>getWorkspace</b>(<i>silent=False</i>)
+
+<p>
+        Public method to get the workspace directory.
+</p>
+<dl>
+
+<dt><i>silent</i> (bool)</dt>
+<dd>
+flag indicating silent operations
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+workspace directory used for saving files
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<a NAME="PyBoardDevice.runScript" ID="PyBoardDevice.runScript"></a>
+<h4>PyBoardDevice.runScript</h4>
+<b>runScript</b>(<i>script</i>)
+
+<p>
+        Public method to run the given Python script.
+</p>
+<dl>
+
+<dt><i>script</i> (str)</dt>
+<dd>
+script to be executed
+</dd>
+</dl>
+<a NAME="PyBoardDevice.setButtons" ID="PyBoardDevice.setButtons"></a>
+<h4>PyBoardDevice.setButtons</h4>
+<b>setButtons</b>(<i></i>)
+
+<p>
+        Public method to enable the supported action buttons.
+</p>
+<a NAME="PyBoardDevice.supportsLocalFileAccess" ID="PyBoardDevice.supportsLocalFileAccess"></a>
+<h4>PyBoardDevice.supportsLocalFileAccess</h4>
+<b>supportsLocalFileAccess</b>(<i></i>)
+
+<p>
+        Public method to indicate file access via a local directory.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating file access via local directory
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,455 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities</h1>
+
+<p>
+Module implementing some utility and compatibility functions for working with
+the ast module.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+
+<tr>
+<td><a href="#getValue">getValue</a></td>
+<td>Function to extract the value of a node.</td>
+</tr>
+<tr>
+<td><a href="#getValue_1">getValue</a></td>
+<td>Function to extract the value of a node.</td>
+</tr>
+<tr>
+<td><a href="#isBaseString">isBaseString</a></td>
+<td>Function to check that a node is a bytes or string.</td>
+</tr>
+<tr>
+<td><a href="#isBaseString_1">isBaseString</a></td>
+<td>Function to check that a node is a bytes or string.</td>
+</tr>
+<tr>
+<td><a href="#isBytes">isBytes</a></td>
+<td>Function to check that a node is a bytes.</td>
+</tr>
+<tr>
+<td><a href="#isBytes_1">isBytes</a></td>
+<td>Function to check that a node is a bytes.</td>
+</tr>
+<tr>
+<td><a href="#isNameConstant">isNameConstant</a></td>
+<td>Function to check that a node is a name constant.</td>
+</tr>
+<tr>
+<td><a href="#isNameConstant_1">isNameConstant</a></td>
+<td>Function to check that a node is a name constant.</td>
+</tr>
+<tr>
+<td><a href="#isNumber">isNumber</a></td>
+<td>Function to check that a node is a number.</td>
+</tr>
+<tr>
+<td><a href="#isNumber_1">isNumber</a></td>
+<td>Function to check that a node is a number.</td>
+</tr>
+<tr>
+<td><a href="#isString">isString</a></td>
+<td>Function to check that a node is a string.</td>
+</tr>
+<tr>
+<td><a href="#isString_1">isString</a></td>
+<td>Function to check that a node is a string.</td>
+</tr>
+</table>
+<hr />
+<hr />
+<a NAME="getValue" ID="getValue"></a>
+<h2>getValue</h2>
+<b>getValue</b>(<i>node</i>)
+
+<p>
+        Function to extract the value of a node.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.Constant)</dt>
+<dd>
+reference to the node to extract the value from
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+value of the node
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+any
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>TypeError</b>:</dt>
+<dd>
+raised to indicate an unsupported type
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="getValue_1" ID="getValue_1"></a>
+<h2>getValue</h2>
+<b>getValue</b>(<i>node</i>)
+
+<p>
+        Function to extract the value of a node.
+</p>
+<dl>
+
+<dt><i>node</i> (one of ast.Num, ast.Str, ast.Bytes or ast.NameConstant)</dt>
+<dd>
+reference to the node to extract the value from
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+value of the node
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+one of str, bytes, int
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>TypeError</b>:</dt>
+<dd>
+raised to indicate an unsupported type
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isBaseString" ID="isBaseString"></a>
+<h2>isBaseString</h2>
+<b>isBaseString</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a bytes or string.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a bytes or string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isBaseString_1" ID="isBaseString_1"></a>
+<h2>isBaseString</h2>
+<b>isBaseString</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a bytes or string.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a bytes or string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isBytes" ID="isBytes"></a>
+<h2>isBytes</h2>
+<b>isBytes</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a bytes.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a bytes
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isBytes_1" ID="isBytes_1"></a>
+<h2>isBytes</h2>
+<b>isBytes</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a bytes.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a bytes
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isNameConstant" ID="isNameConstant"></a>
+<h2>isNameConstant</h2>
+<b>isNameConstant</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a name constant.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a name constant
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isNameConstant_1" ID="isNameConstant_1"></a>
+<h2>isNameConstant</h2>
+<b>isNameConstant</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a name constant.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a name constant
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isNumber" ID="isNumber"></a>
+<h2>isNumber</h2>
+<b>isNumber</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a number.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a number
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isNumber_1" ID="isNumber_1"></a>
+<h2>isNumber</h2>
+<b>isNumber</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a number.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a number
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isString" ID="isString"></a>
+<h2>isString</h2>
+<b>isString</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a string.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="isString_1" ID="isString_1"></a>
+<h2>isString</h2>
+<b>isString</b>(<i>node</i>)
+
+<p>
+        Function to check that a node is a string.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.AST)</dt>
+<dd>
+reference to the node to check
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+flag indicating a string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.MiscellaneousChecker.html	Fri Nov 01 16:11:27 2019 +0100
@@ -1856,10 +1856,6 @@
 <td>Private method to add a node to our list of nodes.</td>
 </tr>
 <tr>
-<td><a href="#TextVisitor.__isBaseString">__isBaseString</a></td>
-<td>Private method to determine, if a node is a base string node.</td>
-</tr>
-<tr>
 <td><a href="#TextVisitor.__visitBody">__visitBody</a></td>
 <td>Private method to traverse the body of the node manually.</td>
 </tr>
@@ -1884,6 +1880,10 @@
 <td>Public method to handle a class definition.</td>
 </tr>
 <tr>
+<td><a href="#TextVisitor.visit_Constant">visit_Constant</a></td>
+<td>Public method to handle constant nodes.</td>
+</tr>
+<tr>
 <td><a href="#TextVisitor.visit_FunctionDef">visit_FunctionDef</a></td>
 <td>Public method to handle a function definition.</td>
 </tr>
@@ -1923,32 +1923,6 @@
 reference to the node to add
 </dd>
 </dl>
-<a NAME="TextVisitor.__isBaseString" ID="TextVisitor.__isBaseString"></a>
-<h4>TextVisitor.__isBaseString</h4>
-<b>__isBaseString</b>(<i>node</i>)
-
-<p>
-        Private method to determine, if a node is a base string node.
-</p>
-<dl>
-
-<dt><i>node</i> (ast.AST)</dt>
-<dd>
-reference to the node to check
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a base string
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-bool
-</dd>
-</dl>
 <a NAME="TextVisitor.__visitBody" ID="TextVisitor.__visitBody"></a>
 <h4>TextVisitor.__visitBody</h4>
 <b>__visitBody</b>(<i>node</i>)
@@ -2037,6 +2011,20 @@
 reference to the node to handle
 </dd>
 </dl>
+<a NAME="TextVisitor.visit_Constant" ID="TextVisitor.visit_Constant"></a>
+<h4>TextVisitor.visit_Constant</h4>
+<b>visit_Constant</b>(<i>node</i>)
+
+<p>
+        Public method to handle constant nodes.
+</p>
+<dl>
+
+<dt><i>node</i> (ast.Constant)</dt>
+<dd>
+reference to the bytes node
+</dd>
+</dl>
 <a NAME="TextVisitor.visit_FunctionDef" ID="TextVisitor.visit_FunctionDef"></a>
 <h4>TextVisitor.visit_FunctionDef</h4>
 <b>visit_FunctionDef</b>(<i>node</i>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.EditorFilePage.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.EditorFilePage.html	Fri Nov 01 16:11:27 2019 +0100
@@ -109,6 +109,10 @@
 <td>Private slot to switch the list of file filters.</td>
 </tr>
 <tr>
+<td><a href="#EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked">on_previewMarkdownPyMdownInstallPushButton_clicked</a></td>
+<td>Private slot to install the pymdown extensions package via pip.</td>
+</tr>
+<tr>
 <td><a href="#EditorFilePage.save">save</a></td>
 <td>Public slot to save the Editor File Handling configuration.</td>
 </tr>
@@ -221,6 +225,13 @@
 flag indicating the check state of the button (boolean)
 </dd>
 </dl>
+<a NAME="EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked" ID="EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked"></a>
+<h4>EditorFilePage.on_previewMarkdownPyMdownInstallPushButton_clicked</h4>
+<b>on_previewMarkdownPyMdownInstallPushButton_clicked</b>(<i></i>)
+
+<p>
+        Private slot to install the pymdown extensions package via pip.
+</p>
 <a NAME="EditorFilePage.save" ID="EditorFilePage.save"></a>
 <h4>EditorFilePage.save</h4>
 <b>save</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.EditorLanguageTabIndentOverrideDialog.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.EditorLanguageTabIndentOverrideDialog.html	Fri Nov 01 16:11:27 2019 +0100
@@ -98,24 +98,24 @@
 </p>
 <dl>
 
-<dt><i>editMode</i> (bool)</dt>
+<dt><i>editMode=</i> (bool)</dt>
 <dd>
 flag indicating the edit mode (Note: in edit mode
             the language is fixed)
 </dd>
-<dt><i>languages</i> (list of str)</dt>
+<dt><i>languages=</i> (list of str)</dt>
 <dd>
 list of available languages
 </dd>
-<dt><i>tabWidth</i> (int)</dt>
+<dt><i>tabWidth=</i> (int)</dt>
 <dd>
 tab width to be set
 </dd>
-<dt><i>indentWidth</i> (int)</dt>
+<dt><i>indentWidth=</i> (int)</dt>
 <dd>
 indentation width to be set
 </dd>
-<dt><i>parent</i> (QWidget)</dt>
+<dt><i>parent=</i> (QWidget)</dt>
 <dd>
 reference to the parent widget
 </dd>
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.WebBrowserVirusTotalPage.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.WebBrowserVirusTotalPage.html	Fri Nov 01 16:11:27 2019 +0100
@@ -57,7 +57,7 @@
     Class implementing VirusTotal configuration page (web browser variant).
 </p>
 <h3>Derived from</h3>
-ConfigurationPageBase, Ui_HelpVirusTotalPage
+ConfigurationPageBase, Ui_WebBrowserVirusTotalPage
 <h3>Class Attributes</h3>
 
 <table>
--- a/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Fri Nov 01 16:11:27 2019 +0100
@@ -156,6 +156,11 @@
         about to be shown. The name of the menu, a reference to the menu and
         a reference to the editor are given.
 </dd>
+<dt>spellLanguageChanged(str)</dt>
+<dd>
+emitted when the editor spell check
+            language was set. The language is passed as a parameter.
+</dd>
 <dt>syntaxerrorToggled(QsciScintillaCompat)</dt>
 <dd>
 emitted when a syntax error
@@ -288,6 +293,10 @@
 <td>Private method to check the selected language of the language submenu.</td>
 </tr>
 <tr>
+<td><a href="#Editor.__checkSpellLanguage">__checkSpellLanguage</a></td>
+<td>Private slot to check the selected spell check language action.</td>
+</tr>
+<tr>
 <td><a href="#Editor.__checkSpellingSelection">__checkSpellingSelection</a></td>
 <td>Private slot to spell check the current selection.</td>
 </tr>
@@ -492,6 +501,10 @@
 <td>Private method used to setup the Show context sub menu.</td>
 </tr>
 <tr>
+<td><a href="#Editor.__initContextMenuSpellLanguages">__initContextMenuSpellLanguages</a></td>
+<td>Private method to setup the spell checking languages context sub menu.</td>
+</tr>
+<tr>
 <td><a href="#Editor.__initContextMenuTools">__initContextMenuTools</a></td>
 <td>Private method used to setup the Tools context sub menu.</td>
 </tr>
@@ -720,6 +733,10 @@
 <td>Private method to configure the eol mode of the editor.</td>
 </tr>
 <tr>
+<td><a href="#Editor.__setFileName">__setFileName</a></td>
+<td>Private method to set the file name of the current file.</td>
+</tr>
+<tr>
 <td><a href="#Editor.__setLineMarkerColours">__setLineMarkerColours</a></td>
 <td>Private method to set the line marker colours.</td>
 </tr>
@@ -808,6 +825,10 @@
 <td>Private slot called before the show menu is shown.</td>
 </tr>
 <tr>
+<td><a href="#Editor.__showContextMenuSpellLanguages">__showContextMenuSpellLanguages</a></td>
+<td>Private slot handling the aboutToShow signal of the spell check languages context menu.</td>
+</tr>
+<tr>
 <td><a href="#Editor.__showContextMenuSpelling">__showContextMenuSpelling</a></td>
 <td>Private slot to set up the spelling menu before it is shown.</td>
 </tr>
@@ -840,6 +861,14 @@
 <td>Private slot called to handle the user entering a character.</td>
 </tr>
 <tr>
+<td><a href="#Editor.__spellLanguageChanged">__spellLanguageChanged</a></td>
+<td>Private slot to handle a change of the spell check language.</td>
+</tr>
+<tr>
+<td><a href="#Editor.__spellLanguagesMenuTriggered">__spellLanguagesMenuTriggered</a></td>
+<td>Private method to handle the selection of a spell check language.</td>
+</tr>
+<tr>
 <td><a href="#Editor.__styleNeeded">__styleNeeded</a></td>
 <td>Private slot to handle the need for more styling.</td>
 </tr>
@@ -1188,6 +1217,10 @@
 <td>Public method to get some share status info.</td>
 </tr>
 <tr>
+<td><a href="#Editor.getSpellingLanguage">getSpellingLanguage</a></td>
+<td>Public method to get the current spelling language.</td>
+</tr>
+<tr>
 <td><a href="#Editor.getSyntaxErrorLines">getSyntaxErrorLines</a></td>
 <td>Public method to get the lines containing a syntax error.</td>
 </tr>
@@ -2046,6 +2079,13 @@
 <p>
         Private method to check the selected language of the language submenu.
 </p>
+<a NAME="Editor.__checkSpellLanguage" ID="Editor.__checkSpellLanguage"></a>
+<h4>Editor.__checkSpellLanguage</h4>
+<b>__checkSpellLanguage</b>(<i></i>)
+
+<p>
+        Private slot to check the selected spell check language action.
+</p>
 <a NAME="Editor.__checkSpellingSelection" ID="Editor.__checkSpellingSelection"></a>
 <h4>Editor.__checkSpellingSelection</h4>
 <b>__checkSpellingSelection</b>(<i></i>)
@@ -2721,6 +2761,25 @@
 reference to the generated menu (QMenu)
 </dd>
 </dl>
+<a NAME="Editor.__initContextMenuSpellLanguages" ID="Editor.__initContextMenuSpellLanguages"></a>
+<h4>Editor.__initContextMenuSpellLanguages</h4>
+<b>__initContextMenuSpellLanguages</b>(<i></i>)
+
+<p>
+        Private method to setup the spell checking languages context sub menu.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+reference to the generated menu
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+QMenu
+</dd>
+</dl>
 <a NAME="Editor.__initContextMenuTools" ID="Editor.__initContextMenuTools"></a>
 <h4>Editor.__initContextMenuTools</h4>
 <b>__initContextMenuTools</b>(<i></i>)
@@ -3436,6 +3495,20 @@
 <p>
         Private method to configure the eol mode of the editor.
 </p>
+<a NAME="Editor.__setFileName" ID="Editor.__setFileName"></a>
+<h4>Editor.__setFileName</h4>
+<b>__setFileName</b>(<i>name</i>)
+
+<p>
+        Private method to set the file name of the current file.
+</p>
+<dl>
+
+<dt><i>name</i> (str)</dt>
+<dd>
+name of the current file
+</dd>
+</dl>
 <a NAME="Editor.__setLineMarkerColours" ID="Editor.__setLineMarkerColours"></a>
 <h4>Editor.__setLineMarkerColours</h4>
 <b>__setLineMarkerColours</b>(<i></i>)
@@ -3625,6 +3698,14 @@
 <p>
         Private slot called before the show menu is shown.
 </p>
+<a NAME="Editor.__showContextMenuSpellLanguages" ID="Editor.__showContextMenuSpellLanguages"></a>
+<h4>Editor.__showContextMenuSpellLanguages</h4>
+<b>__showContextMenuSpellLanguages</b>(<i></i>)
+
+<p>
+        Private slot handling the aboutToShow signal of the spell check
+        languages context menu.
+</p>
 <a NAME="Editor.__showContextMenuSpelling" ID="Editor.__showContextMenuSpelling"></a>
 <h4>Editor.__showContextMenuSpelling</h4>
 <b>__showContextMenuSpelling</b>(<i></i>)
@@ -3704,6 +3785,38 @@
 value of the character entered (integer)
 </dd>
 </dl>
+<a NAME="Editor.__spellLanguageChanged" ID="Editor.__spellLanguageChanged"></a>
+<h4>Editor.__spellLanguageChanged</h4>
+<b>__spellLanguageChanged</b>(<i>language, propagate=True</i>)
+
+<p>
+        Private slot to handle a change of the spell check language.
+</p>
+<dl>
+
+<dt><i>language</i> (str)</dt>
+<dd>
+new spell check language
+</dd>
+<dt><i>propagate</i> (bool)</dt>
+<dd>
+flag indicating to propagate the change
+</dd>
+</dl>
+<a NAME="Editor.__spellLanguagesMenuTriggered" ID="Editor.__spellLanguagesMenuTriggered"></a>
+<h4>Editor.__spellLanguagesMenuTriggered</h4>
+<b>__spellLanguagesMenuTriggered</b>(<i>act</i>)
+
+<p>
+        Private method to handle the selection of a spell check language.
+</p>
+<dl>
+
+<dt><i>act</i> (QAction)</dt>
+<dd>
+reference to the action that was triggered
+</dd>
+</dl>
 <a NAME="Editor.__styleNeeded" ID="Editor.__styleNeeded"></a>
 <h4>Editor.__styleNeeded</h4>
 <b>__styleNeeded</b>(<i>position</i>)
@@ -4941,6 +5054,25 @@
             (boolean, boolean, boolean, boolean)
 </dd>
 </dl>
+<a NAME="Editor.getSpellingLanguage" ID="Editor.getSpellingLanguage"></a>
+<h4>Editor.getSpellingLanguage</h4>
+<b>getSpellingLanguage</b>(<i></i>)
+
+<p>
+        Public method to get the current spelling language.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+current spelling language
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="Editor.getSyntaxErrorLines" ID="Editor.getSyntaxErrorLines"></a>
 <h4>Editor.getSyntaxErrorLines</h4>
 <b>getSyntaxErrorLines</b>(<i></i>)
@@ -5487,17 +5619,29 @@
         Public method to check, if the given position is within a region, that
         should be spell checked.
 </p>
-<dl>
-
-<dt><i>pos</i></dt>
-<dd>
-position to be checked (integer)
+<p>
+        For files with a configured full text file extension all regions will
+        be regarded as to be checked. Depending on configuration, all unknown
+        files (i.e. those without a file extension) will be checked fully as
+        well.
+</p>
+<dl>
+
+<dt><i>pos</i> (int)</dt>
+<dd>
+position to be checked
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating pos is in a spell check region (boolean)
+flag indicating pos is in a spell check region
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl>
 <a NAME="Editor.joinLines" ID="Editor.joinLines"></a>
--- a/eric6/Documentation/Source/eric6.QScintilla.Exporters.ExporterHTML.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Exporters.ExporterHTML.html	Fri Nov 01 16:11:27 2019 +0100
@@ -42,10 +42,6 @@
 <td><a href="#HTMLGenerator">HTMLGenerator</a></td>
 <td>Class implementing an HTML generator for exporting source code.</td>
 </tr>
-<tr>
-<td><a href="#_StrikeThroughExtension">_StrikeThroughExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
 </table>
 <h3>Functions</h3>
 
@@ -254,50 +250,4 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
-<hr />
-<a NAME="_StrikeThroughExtension" ID="_StrikeThroughExtension"></a>
-<h2>_StrikeThroughExtension</h2>
-
-<p>
-                Class is placed here, because it depends on imported markdown,
-                and markdown import is lazy.
-</p>
-<p>
-                (see http://achinghead.com/
-                python-markdown-adding-insert-delete.html this page for
-                details)
-</p>
-<h3>Derived from</h3>
-markdown.Extension
-<h3>Class Attributes</h3>
-
-<table>
-<tr><td>DEL_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_StrikeThroughExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_StrikeThroughExtension.extendMarkdown" ID="_StrikeThroughExtension.extendMarkdown"></a>
-<h4>_StrikeThroughExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.UI.Previewer.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.UI.Previewer.html	Fri Nov 01 16:11:27 2019 +0100
@@ -106,6 +106,10 @@
 <td>Public method to hide the preview widget.</td>
 </tr>
 <tr>
+<td><a href="#Previewer.preferencesChanged">preferencesChanged</a></td>
+<td>Public slot handling a change of preferences.</td>
+</tr>
+<tr>
 <td><a href="#Previewer.show">show</a></td>
 <td>Public method to show the preview widget.</td>
 </tr>
@@ -240,6 +244,13 @@
 <p>
         Public method to hide the preview widget.
 </p>
+<a NAME="Previewer.preferencesChanged" ID="Previewer.preferencesChanged"></a>
+<h4>Previewer.preferencesChanged</h4>
+<b>preferencesChanged</b>(<i></i>)
+
+<p>
+        Public slot handling a change of preferences.
+</p>
 <a NAME="Previewer.show" ID="Previewer.show"></a>
 <h4>Previewer.show</h4>
 <b>show</b>(<i></i>)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/eric6.UI.Previewers.MarkdownExtensions.html	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,227 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.UI.Previewers.MarkdownExtensions</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric6.UI.Previewers.MarkdownExtensions</h1>
+
+<p>
+Module implementing some Markdown extensions.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>MermaidRegex</td></tr><tr><td>MermaidRegexFullText</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#MermaidExtension">MermaidExtension</a></td>
+<td>Class implementing a Markdown Extension for Mermaid.</td>
+</tr>
+<tr>
+<td><a href="#MermaidPreprocessor">MermaidPreprocessor</a></td>
+<td>Class implementing a markdown pre-processor for Mermaid.</td>
+</tr>
+<tr>
+<td><a href="#SimplePatternExtension">SimplePatternExtension</a></td>
+<td>Class implementing a Markdown extension for ~, ~~, ^, ^^ and ==.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="MermaidExtension" ID="MermaidExtension"></a>
+<h2>MermaidExtension</h2>
+
+<p>
+    Class implementing a Markdown Extension for Mermaid.
+</p>
+<h3>Derived from</h3>
+Extension
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#MermaidExtension.extendMarkdown">extendMarkdown</a></td>
+<td>Public method to register the extension.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="MermaidExtension.extendMarkdown" ID="MermaidExtension.extendMarkdown"></a>
+<h4>MermaidExtension.extendMarkdown</h4>
+<b>extendMarkdown</b>(<i>md, md_globals</i>)
+
+<p>
+        Public method to register the extension.
+</p>
+<dl>
+
+<dt><i>md</i></dt>
+<dd>
+reference to markdown
+</dd>
+<dt><i>md_globals</i></dt>
+<dd>
+global config parameters
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="MermaidPreprocessor" ID="MermaidPreprocessor"></a>
+<h2>MermaidPreprocessor</h2>
+
+<p>
+    Class implementing a markdown pre-processor for Mermaid.
+</p>
+<h3>Derived from</h3>
+Preprocessor
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#MermaidPreprocessor.run">run</a></td>
+<td>Public method to do the pre-processing.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="MermaidPreprocessor.run" ID="MermaidPreprocessor.run"></a>
+<h4>MermaidPreprocessor.run</h4>
+<b>run</b>(<i>lines</i>)
+
+<p>
+        Public method to do the pre-processing.
+</p>
+<dl>
+
+<dt><i>lines</i> (list of str)</dt>
+<dd>
+text lines to be processed
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+processed lines
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+list of str
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="SimplePatternExtension" ID="SimplePatternExtension"></a>
+<h2>SimplePatternExtension</h2>
+
+<p>
+    Class implementing a Markdown extension for ~, ~~, ^, ^^ and ==.
+</p>
+<p>
+    Note: This is a very simple pattern extension that might conflict with
+    formulas set for MathJax. Use the 'pymdown-extensions' package in this
+    case.
+</p>
+<h3>Derived from</h3>
+Extension
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>DEL_RE</td></tr><tr><td>INS_RE</td></tr><tr><td>MARK_RE</td></tr><tr><td>SUB_RE</td></tr><tr><td>SUP_RE</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#SimplePatternExtension.extendMarkdown">extendMarkdown</a></td>
+<td>Public method to register the extension.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="SimplePatternExtension.extendMarkdown" ID="SimplePatternExtension.extendMarkdown"></a>
+<h4>SimplePatternExtension.extendMarkdown</h4>
+<b>extendMarkdown</b>(<i>md</i>)
+
+<p>
+        Public method to register the extension.
+</p>
+<dl>
+
+<dt><i>md</i></dt>
+<dd>
+reference to markdown
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTML.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTML.html	Fri Nov 01 16:11:27 2019 +0100
@@ -42,10 +42,6 @@
 <td><a href="#PreviewerHTML">PreviewerHTML</a></td>
 <td>Class implementing a previewer widget for HTML, Markdown and ReST files.</td>
 </tr>
-<tr>
-<td><a href="#_StrikeThroughExtension">_StrikeThroughExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
 </table>
 <h3>Functions</h3>
 
@@ -150,31 +146,42 @@
 </dl>
 <a NAME="PreviewProcessingThread.__convertMarkdown" ID="PreviewProcessingThread.__convertMarkdown"></a>
 <h4>PreviewProcessingThread.__convertMarkdown</h4>
-<b>__convertMarkdown</b>(<i>text, convertNewLineToBreak, htmlFormat</i>)
+<b>__convertMarkdown</b>(<i>text, convertNewLineToBreak, usePyMdownExtensions, htmlFormat</i>)
 
 <p>
         Private method to convert Markdown text into HTML.
 </p>
 <dl>
 
-<dt><i>text</i></dt>
+<dt><i>text</i> (str)</dt>
 <dd>
-text to be processed (string)
+text to be processed
 </dd>
-<dt><i>convertNewLineToBreak</i></dt>
+<dt><i>convertNewLineToBreak</i> (bool)</dt>
 <dd>
 flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
+            to HTML break (Markdown only)
 </dd>
-<dt><i>htmlFormat</i></dt>
+<dt><i>usePyMdownExtensions</i> (bool)</dt>
 <dd>
-HTML format to be generated by markdown (string)
+flag indicating to enable the PyMdown
+            extensions, if they are available
+</dd>
+<dt><i>htmlFormat</i> (str)</dt>
+<dd>
+HTML format to be generated by markdown
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-processed HTML (string)
+processed HTML
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
 </dd>
 </dl>
 <a NAME="PreviewProcessingThread.__convertReST" ID="PreviewProcessingThread.__convertReST"></a>
@@ -253,7 +260,7 @@
 </dl>
 <a NAME="PreviewProcessingThread.__getHtml" ID="PreviewProcessingThread.__getHtml"></a>
 <h4>PreviewProcessingThread.__getHtml</h4>
-<b>__getHtml</b>(<i>language, text, ssiEnabled, filePath, rootPath, useSphinx, convertNewLineToBreak, markdownHtmlFormat, restDocutilsHtmlFormat</i>)
+<b>__getHtml</b>(<i>language, text, ssiEnabled, filePath, rootPath, useSphinx, convertNewLineToBreak, usePyMdownExtensions, markdownHtmlFormat, restDocutilsHtmlFormat</i>)
 
 <p>
         Private method to process the given text depending upon the given
@@ -261,52 +268,60 @@
 </p>
 <dl>
 
-<dt><i>language</i></dt>
+<dt><i>language</i> (str)</dt>
 <dd>
-language of the text (string)
+language of the text
 </dd>
-<dt><i>text</i></dt>
+<dt><i>text</i> (str)</dt>
 <dd>
-to be processed (string)
+to be processed
 </dd>
-<dt><i>ssiEnabled</i></dt>
+<dt><i>ssiEnabled</i> (bool)</dt>
 <dd>
 flag indicating to do some (limited) SSI processing
-            (boolean)
 </dd>
-<dt><i>filePath</i></dt>
+<dt><i>filePath</i> (str)</dt>
 <dd>
-file path of the text (string)
+file path of the text
 </dd>
-<dt><i>rootPath</i></dt>
+<dt><i>rootPath</i> (str)</dt>
 <dd>
-root path to be used for SSI processing (str)
+root path to be used for SSI processing
 </dd>
-<dt><i>useSphinx</i></dt>
+<dt><i>useSphinx</i> (bool)</dt>
 <dd>
 flag indicating to use Sphinx to generate the
-            ReST preview (boolean)
+            ReST preview
 </dd>
-<dt><i>convertNewLineToBreak</i></dt>
+<dt><i>convertNewLineToBreak</i> (bool)</dt>
 <dd>
 flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
+            to HTML break (Markdown only)
 </dd>
-<dt><i>markdownHtmlFormat</i></dt>
+<dt><i>usePyMdownExtensions</i> (bool)</dt>
+<dd>
+flag indicating to enable the PyMdown
+            extensions, if they are available
+</dd>
+<dt><i>markdownHtmlFormat</i> (str)</dt>
 <dd>
 HTML format to be generated by markdown
-            (string)
 </dd>
-<dt><i>restDocutilsHtmlFormat</i></dt>
+<dt><i>restDocutilsHtmlFormat</i> (str)</dt>
 <dd>
 HTML format to be generated by docutils
-            (string)
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-processed HTML text (string)
+processed HTML text
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
 </dd>
 </dl>
 <a NAME="PreviewProcessingThread.__processRootPath" ID="PreviewProcessingThread.__processRootPath"></a>
@@ -373,53 +388,55 @@
 </dl>
 <a NAME="PreviewProcessingThread.process" ID="PreviewProcessingThread.process"></a>
 <h4>PreviewProcessingThread.process</h4>
-<b>process</b>(<i>filePath, language, text, ssiEnabled, rootPath, useSphinx, convertNewLineToBreak, markdownHtmlFormat, restDocutilsHtmlFormat</i>)
+<b>process</b>(<i>filePath, language, text, ssiEnabled, rootPath, useSphinx, convertNewLineToBreak, usePyMdownExtensions, markdownHtmlFormat, restDocutilsHtmlFormat</i>)
 
 <p>
         Public method to convert the given text to HTML.
 </p>
 <dl>
 
-<dt><i>filePath</i></dt>
+<dt><i>filePath</i> (str)</dt>
 <dd>
-file path of the text (string)
+file path of the text
 </dd>
-<dt><i>language</i></dt>
+<dt><i>language</i> (str)</dt>
 <dd>
-language of the text (string)
+language of the text
 </dd>
-<dt><i>text</i></dt>
+<dt><i>text</i> (str)</dt>
 <dd>
-text to be processed (string)
+text to be processed
 </dd>
-<dt><i>ssiEnabled</i></dt>
+<dt><i>ssiEnabled</i> (bool)</dt>
 <dd>
 flag indicating to do some (limited) SSI processing
-            (boolean)
 </dd>
-<dt><i>rootPath</i></dt>
+<dt><i>rootPath</i> (str)</dt>
 <dd>
-root path to be used for SSI processing (str)
+root path to be used for SSI processing
 </dd>
-<dt><i>useSphinx</i></dt>
+<dt><i>useSphinx</i> (bool)</dt>
 <dd>
 flag indicating to use Sphinx to generate the
-            ReST preview (boolean)
+            ReST preview
 </dd>
-<dt><i>convertNewLineToBreak</i></dt>
+<dt><i>convertNewLineToBreak</i> (bool)</dt>
 <dd>
 flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
+            to HTML break (Markdown only)
 </dd>
-<dt><i>markdownHtmlFormat</i></dt>
+<dt><i>usePyMdownExtensions</i> (bool)</dt>
+<dd>
+flag indicating to enable the PyMdown
+            extensions, if they are available
+</dd>
+<dt><i>markdownHtmlFormat</i> (str)</dt>
 <dd>
 HTML format to be generated by markdown
-            (string)
 </dd>
-<dt><i>restDocutilsHtmlFormat</i></dt>
+<dt><i>restDocutilsHtmlFormat</i> (str)</dt>
 <dd>
 HTML format to be generated by docutils
-            (string)
 </dd>
 </dl>
 <a NAME="PreviewProcessingThread.run" ID="PreviewProcessingThread.run"></a>
@@ -687,49 +704,4 @@
 </p>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
-<hr />
-<a NAME="_StrikeThroughExtension" ID="_StrikeThroughExtension"></a>
-<h2>_StrikeThroughExtension</h2>
-
-<p>
-                Class is placed here, because it depends on imported markdown,
-                and markdown import is lazy.
-</p>
-<p>
-                (see https://pythonhosted.org/Markdown/extensions/api.html
-                this page for details)
-</p>
-<h3>Derived from</h3>
-markdown.Extension
-<h3>Class Attributes</h3>
-
-<table>
-<tr><td>DEL_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_StrikeThroughExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_StrikeThroughExtension.extendMarkdown" ID="_StrikeThroughExtension.extendMarkdown"></a>
-<h4>_StrikeThroughExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
 </body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTMLStyles.html	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html><head>
+<title>eric6.UI.Previewers.PreviewerHTMLStyles</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>eric6.UI.Previewers.PreviewerHTMLStyles</h1>
+
+<p>
+Module implementing CSS styles for the Markdown preview.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>css_markdown</td></tr><tr><td>css_pygments</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.UI.UserInterface.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/eric6.UI.UserInterface.html	Fri Nov 01 16:11:27 2019 +0100
@@ -113,17 +113,21 @@
 
 <a NAME="Redirector.__init__" ID="Redirector.__init__"></a>
 <h4>Redirector (Constructor)</h4>
-<b>Redirector</b>(<i>stderr</i>)
+<b>Redirector</b>(<i>stderr, parent=None</i>)
 
 <p>
         Constructor
 </p>
 <dl>
 
-<dt><i>stderr</i></dt>
+<dt><i>stderr</i> (bool)</dt>
 <dd>
 flag indicating stderr is being redirected
 </dd>
+<dt><i>parent</i> (QObject)</dt>
+<dd>
+reference to the parent object
+</dd>
 </dl>
 <a NAME="Redirector.__bufferedWrite" ID="Redirector.__bufferedWrite"></a>
 <h4>Redirector.__bufferedWrite</h4>
--- a/eric6/Documentation/Source/index-eric6.MicroPython.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.MicroPython.html	Fri Nov 01 16:11:27 2019 +0100
@@ -85,5 +85,9 @@
 <td><a href="eric6.MicroPython.MicrobitDevices.html">MicrobitDevices</a></td>
 <td>Module implementing the device interface class for BBC micro:bit boards.</td>
 </tr>
+<tr>
+<td><a href="eric6.MicroPython.PyBoardDevices.html">PyBoardDevices</a></td>
+<td>Module implementing the device interface class for PyBoard boards.</td>
+</tr>
 </table>
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/index-eric6.Plugins.CheckerPlugins.CodeStyleChecker.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.Plugins.CheckerPlugins.CodeStyleChecker.html	Fri Nov 01 16:11:27 2019 +0100
@@ -34,6 +34,10 @@
 <td>Module implementing a checker for function type annotations.</td>
 </tr>
 <tr>
+<td><a href="eric6.Plugins.CheckerPlugins.CodeStyleChecker.AstUtilities.html">AstUtilities</a></td>
+<td>Module implementing some utility and compatibility functions for working with the ast module.</td>
+</tr>
+<tr>
 <td><a href="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleAddBuiltinIgnoreDialog.html">CodeStyleAddBuiltinIgnoreDialog</a></td>
 <td>Module implementing a dialog to enter the data for a built-in assignment to be ignored.</td>
 </tr>
--- a/eric6/Documentation/Source/index-eric6.UI.Previewers.html	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.UI.Previewers.html	Fri Nov 01 16:11:27 2019 +0100
@@ -30,10 +30,18 @@
 <table>
 
 <tr>
+<td><a href="eric6.UI.Previewers.MarkdownExtensions.html">MarkdownExtensions</a></td>
+<td>Module implementing some Markdown extensions.</td>
+</tr>
+<tr>
 <td><a href="eric6.UI.Previewers.PreviewerHTML.html">PreviewerHTML</a></td>
 <td>Module implementing a previewer widget for HTML, Markdown and ReST files.</td>
 </tr>
 <tr>
+<td><a href="eric6.UI.Previewers.PreviewerHTMLStyles.html">PreviewerHTMLStyles</a></td>
+<td>Module implementing CSS styles for the Markdown preview.</td>
+</tr>
+<tr>
 <td><a href="eric6.UI.Previewers.PreviewerQSS.html">PreviewerQSS</a></td>
 <td>Module implementing a previewer widget for Qt style sheet files.</td>
 </tr>
--- a/eric6/E5Gui/E5ErrorMessage.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/E5Gui/E5ErrorMessage.py	Fri Nov 01 16:11:27 2019 +0100
@@ -16,6 +16,7 @@
 
 import Globals
 import Utilities
+import Preferences
 
 
 _msgHandlerDialog = None
@@ -111,6 +112,11 @@
     @type bytes
     """
     if _msgHandlerDialog:
+        if msgType < Preferences.getUI("MinimumMessageTypeSeverity"):
+            # severity is lower than configured
+            # just ignore the message
+            return
+        
         try:
             if msgType == QtDebugMsg:
                 messageType = "Debug Message:"
--- a/eric6/MicroPython/MicroPythonCommandsInterface.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/MicroPython/MicroPythonCommandsInterface.py	Fri Nov 01 16:11:27 2019 +0100
@@ -760,7 +760,8 @@
                 "    try:",           # Pyboard (it doesn't have machine.RTC())
                 "        import pyb as __pyb_",
                 "        rtc = __pyb_.RTC()",
-                "        clock_time = rtc_time[:6] + (rtc_time[6] + 1, 0)",
+                "        clock_time = rtc_time[:3] +"
+                " (rtc_time[6] + 1,) + rtc_time[3:6] + (0,)",
                 "        rtc.datetime(clock_time)",
                 "        del __pyb_",
                 "    except Exception:",
--- a/eric6/MicroPython/MicroPythonDevices.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/MicroPython/MicroPythonDevices.py	Fri Nov 01 16:11:27 2019 +0100
@@ -54,6 +54,16 @@
         "description": "BBC micro:bit",
         "icon": "microbitDevice",
     },
+    
+    "pyboard": {
+        "ids": [
+            (0xF055, 0x9800),       # Pyboard in CDC mode
+            (0xF055, 0x9801),       # Pyboard in CDC+HID mode
+            (0xF055, 0x9802),       # Pyboard in CDC+MSC mode
+        ],
+        "description": "PyBoard",
+        "icon": "micropython48",
+    }
 }
 
 
@@ -144,6 +154,9 @@
     elif deviceType == "bbc_microbit":
         from .MicrobitDevices import MicrobitDevice
         return MicrobitDevice(microPythonWidget)
+    elif deviceType == "pyboard":
+        from .PyBoardDevices import PyBoardDevice
+        return PyBoardDevice(microPythonWidget)
     else:
         # nothing specific requested
         return MicroPythonDevice(microPythonWidget)
--- a/eric6/MicroPython/MicroPythonWidget.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/MicroPython/MicroPythonWidget.py	Fri Nov 01 16:11:27 2019 +0100
@@ -1109,6 +1109,7 @@
             act.setEnabled(self.__connected)
         self.__superMenu.addAction(
             self.tr("Show Local Time"), self.__showLocalTime)
+        # TODO: add entry to show local and device time side-by-side
         self.__superMenu.addSeparator()
         if not Globals.isWindowsPlatform():
             available = self.__mpyCrossAvailable()
--- a/eric6/MicroPython/MicrobitDevices.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/MicroPython/MicrobitDevices.py	Fri Nov 01 16:11:27 2019 +0100
@@ -8,17 +8,17 @@
 """
 
 
-import sys
 import os
+import shutil
 
 from PyQt5.QtCore import pyqtSlot, QStandardPaths
+from PyQt5.QtWidgets import QInputDialog, QLineEdit
 
 from .MicroPythonDevices import MicroPythonDevice
 from .MicroPythonWidget import HAS_QTCHART
 
 from E5Gui import E5MessageBox, E5FileDialog
 from E5Gui.E5Application import e5App
-from E5Gui.E5ProcessDialog import E5ProcessDialog
 
 import Utilities
 import Preferences
@@ -160,17 +160,14 @@
         """
         connected = self.microPython.isConnected()
         
-        act = menu.addAction(self.tr("Flash Default MicroPython Firmware"),
+        act = menu.addAction(self.tr("Flash MicroPython Firmware"),
                              self.__flashMicroPython)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Flash Custom MicroPython Firmware"),
-                             self.__flashCustomMicroPython)
-        act.setEnabled(not connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Flash Script"), self.__flashScript)
+        act = menu.addAction(self.tr("Save Script"), self.__saveScriptToDevice)
         act.setToolTip(self.tr(
-            "Flash the current script to the selected device."))
-        act.setEnabled(not connected)
+            "Save the current script to the selected device"))
+        act.setEnabled(connected)
         act = menu.addAction(self.tr("Save Script as 'main.py'"),
                              self.__saveMain)
         act.setToolTip(self.tr(
@@ -179,87 +176,35 @@
         menu.addSeparator()
         act = menu.addAction(self.tr("Reset micro:bit"), self.__resetDevice)
         act.setEnabled(connected)
-        menu.addSeparator()
-        menu.addAction(self.tr("Install 'uflash'"), self.__installUflashTool)
     
     @pyqtSlot()
     def __flashMicroPython(self):
         """
         Private slot to flash the default MicroPython firmware to the device.
         """
-        flashArgs = [
-            "-u",
-            "-m", "uflash",
-        ]
-        dlg = E5ProcessDialog(self.tr("'uflash' Output"),
-                              self.tr("Flash Default MicroPython Firmware"))
-        res = dlg.startProcess(sys.executable, flashArgs)
-        if res:
-            dlg.exec_()
-    
-    @pyqtSlot()
-    def __flashCustomMicroPython(self):
-        """
-        Private slot to flash a custom MicroPython firmware to the device.
-        """
-        downloadsPath = QStandardPaths.standardLocations(
-            QStandardPaths.DownloadLocation)[0]
-        firmware = E5FileDialog.getOpenFileName(
-            self.microPython,
-            self.tr("Flash Custom MicroPython Firmware"),
-            downloadsPath,
-            self.tr("MicroPython Firmware Files (*.hex);;All Files (*)"))
-        if firmware and os.path.exists(firmware):
-            flashArgs = [
-                "-u",
-                "-m", "uflash",
-                "--runtime", firmware,
-            ]
-            dlg = E5ProcessDialog(
-                self.tr("'uflash' Output"),
-                self.tr("Flash Default MicroPython Firmware"))
-            res = dlg.startProcess(sys.executable, flashArgs)
-            if res:
-                dlg.exec_()
-    
-    @pyqtSlot()
-    def __flashScript(self):
-        """
-        Private slot to flash the current script onto the selected device.
-        """
-        aw = e5App().getObject("ViewManager").activeWindow()
-        if not aw:
-            return
-        
-        if not (aw.isPyFile() or aw.isMicroPythonFile()):
-            yes = E5MessageBox.yesNo(
+        # Attempts to find the path on the filesystem that represents the
+        # plugged in micro:bit board in maintenance mode.
+        deviceDirectory = Utilities.findVolume("MAINTENANCE")
+        if not deviceDirectory:
+            # BBC micro:bit is not ready or not mounted
+            E5MessageBox.critical(
                 self.microPython,
-                self.tr("Flash Script"),
-                self.tr("""The current editor does not contain a Python"""
-                        """ script. Flash it anyway?"""))
-            if not yes:
-                return
-        
-        script = aw.text().strip()
-        if not script:
-            E5MessageBox.warning(
+                self.tr("Flash MicroPython Firmware"),
+                self.tr(
+                    'The BBC micro:bit is not ready for flashing. See the'
+                    ' <a href="https://microbit.org/guide/firmware/">'
+                    'micro:bit web site</a> for details.'
+                ))
+        else:
+            downloadsPath = QStandardPaths.standardLocations(
+                QStandardPaths.DownloadLocation)[0]
+            firmware = E5FileDialog.getOpenFileName(
                 self.microPython,
-                self.tr("Flash Script"),
-                self.tr("""The script is empty. Aborting."""))
-            return
-        
-        if aw.checkDirty():
-            filename = aw.getFileName()
-            flashArgs = [
-                "-u",
-                "-m", "uflash",
-                filename,
-            ]
-            dlg = E5ProcessDialog(self.tr("'uflash' Output"),
-                                  self.tr("Flash Script"))
-            res = dlg.startProcess(sys.executable, flashArgs)
-            if res:
-                dlg.exec_()
+                self.tr("Flash MicroPython Firmware"),
+                downloadsPath,
+                self.tr("MicroPython Firmware Files (*.hex);;All Files (*)"))
+            if firmware and os.path.exists(firmware):
+                shutil.copy2(firmware, deviceDirectory)
     
     @pyqtSlot()
     def __saveMain(self):
@@ -267,14 +212,30 @@
         Private slot to copy the current script as 'main.py' onto the
         connected device.
         """
+        self.__saveScriptToDevice("main.py")
+    
+    @pyqtSlot()
+    def __saveScriptToDevice(self, scriptName=""):
+        """
+        Private method to save the current script onto the connected
+        device.
+        
+        @param scriptName name of the file on the device
+        @type str
+        """
         aw = e5App().getObject("ViewManager").activeWindow()
         if not aw:
             return
         
+        if scriptName:
+            title = self.tr("Save Script as '{0}'").format(scriptName)
+        else:
+            title = self.tr("Save Script")
+        
         if not (aw.isPyFile() or aw.isMicroPythonFile()):
             yes = E5MessageBox.yesNo(
                 self.microPython,
-                self.tr("Save Script as 'main.py'"),
+                title,
                 self.tr("""The current editor does not contain a Python"""
                         """ script. Write it anyway?"""))
             if not yes:
@@ -284,12 +245,25 @@
         if not script:
             E5MessageBox.warning(
                 self.microPython,
-                self.tr("Save Script as 'main.py'"),
+                title,
                 self.tr("""The script is empty. Aborting."""))
             return
         
+        if not scriptName:
+            scriptName = os.path.basename(aw.getFileName())
+            scriptName, ok = QInputDialog.getText(
+                self.microPython,
+                title,
+                self.tr("Enter a file name on the device:"),
+                QLineEdit.Normal,
+                scriptName)
+            if not ok or not bool(scriptName):
+                return
+            
+            title = self.tr("Save Script as '{0}'").format(scriptName)
+        
         commands = [
-            "fd = open('main.py', 'wb')",
+            "fd = open('{0}', 'wb')".format(scriptName),
             "f = fd.write",
         ]
         for line in script.splitlines():
@@ -299,16 +273,13 @@
         if err:
             E5MessageBox.critical(
                 self.microPython,
-                self.tr("Save Script as 'main.py'"),
+                title,
                 self.tr("""<p>The script could not be saved to the"""
                         """ device.</p><p>Reason: {0}</p>""")
                 .format(err.decode("utf-8")))
         
         # reset the device
-        self.microPython.commandsInterface().execute([
-            "import microbit",
-            "microbit.reset()",
-        ])
+        self.__resetDevice()
     
     @pyqtSlot()
     def __resetDevice(self):
@@ -320,14 +291,6 @@
             "microbit.reset()",
         ])
     
-    @pyqtSlot()
-    def __installUflashTool(self):
-        """
-        Private slot to install the uflash package via pip.
-        """
-        pip = e5App().getObject("Pip")
-        pip.installPackages(["uflash"], interpreter=sys.executable)
-    
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/MicroPython/PyBoardDevices.py	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,197 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the device interface class for PyBoard boards.
+"""
+
+from E5Gui import E5MessageBox
+from E5Gui.E5Application import e5App
+
+from .MicroPythonDevices import MicroPythonDevice
+from .MicroPythonWidget import HAS_QTCHART
+
+import Utilities
+import Preferences
+
+
+class PyBoardDevice(MicroPythonDevice):
+    """
+    Class implementing the device for PyBoard boards.
+    """
+    DeviceVolumeName = "PYBFLASH"
+    
+    FlashInstructionsURL = (
+        "https://github.com/micropython/micropython/wiki/"
+        "Pyboard-Firmware-Update"
+    )
+    
+    def __init__(self, microPythonWidget, parent=None):
+        """
+        Constructor
+        
+        @param microPythonWidget reference to the main MicroPython widget
+        @type MicroPythonWidget
+        @param parent reference to the parent object
+        @type QObject
+        """
+        super(PyBoardDevice, self).__init__(microPythonWidget, parent)
+    
+    def setButtons(self):
+        """
+        Public method to enable the supported action buttons.
+        """
+        super(PyBoardDevice, self).setButtons()
+        self.microPython.setActionButtons(
+            run=True, repl=True, files=True, chart=HAS_QTCHART)
+        
+        if self.__deviceVolumeMounted():
+            self.microPython.setActionButtons(open=True, save=True)
+    
+    def forceInterrupt(self):
+        """
+        Public method to determine the need for an interrupt when opening the
+        serial connection.
+        
+        @return flag indicating an interrupt is needed
+        @rtype bool
+        """
+        return False
+    
+    def deviceName(self):
+        """
+        Public method to get the name of the device.
+        
+        @return name of the device
+        @rtype str
+        """
+        return self.tr("PyBoard")
+    
+    def canStartRepl(self):
+        """
+        Public method to determine, if a REPL can be started.
+        
+        @return tuple containing a flag indicating it is safe to start a REPL
+            and a reason why it cannot.
+        @rtype tuple of (bool, str)
+        """
+        return True, ""
+    
+    def canStartPlotter(self):
+        """
+        Public method to determine, if a Plotter can be started.
+        
+        @return tuple containing a flag indicating it is safe to start a
+            Plotter and a reason why it cannot.
+        @rtype tuple of (bool, str)
+        """
+        return True, ""
+    
+    def canRunScript(self):
+        """
+        Public method to determine, if a script can be executed.
+        
+        @return tuple containing a flag indicating it is safe to start a
+            Plotter and a reason why it cannot.
+        @rtype tuple of (bool, str)
+        """
+        return True, ""
+    
+    def runScript(self, script):
+        """
+        Public method to run the given Python script.
+        
+        @param script script to be executed
+        @type str
+        """
+        pythonScript = script.split("\n")
+        self.sendCommands(pythonScript)
+    
+    def canStartFileManager(self):
+        """
+        Public method to determine, if a File Manager can be started.
+        
+        @return tuple containing a flag indicating it is safe to start a
+            File Manager and a reason why it cannot.
+        @rtype tuple of (bool, str)
+        """
+        return True, ""
+    
+    def supportsLocalFileAccess(self):
+        """
+        Public method to indicate file access via a local directory.
+        
+        @return flag indicating file access via local directory
+        @rtype bool
+        """
+        return self.__deviceVolumeMounted()
+    
+    def __deviceVolumeMounted(self):
+        """
+        Private method to check, if the device volume is mounted.
+        
+        @return flag indicated a mounted device
+        @rtype bool
+        """
+        return self.getWorkspace(silent=True).endswith(self.DeviceVolumeName)
+    
+    def getWorkspace(self, silent=False):
+        """
+        Public method to get the workspace directory.
+        
+        @param silent flag indicating silent operations
+        @type bool
+        @return workspace directory used for saving files
+        @rtype str
+        """
+        # Attempts to find the path on the filesystem that represents the
+        # plugged in PyBoard board.
+        deviceDirectory = Utilities.findVolume(self.DeviceVolumeName)
+        
+        if deviceDirectory:
+            return deviceDirectory
+        else:
+            # return the default workspace and give the user a warning (unless
+            # silent mode is selected)
+            if not silent:
+                E5MessageBox.warning(
+                    self.microPython,
+                    self.tr("Workspace Directory"),
+                    self.tr("Python files for PyBoard devices are stored"
+                            " on the device. Therefore, to edit these files"
+                            " you need to have the device plugged in. Until"
+                            " you plug in a device, the standard directory"
+                            " will be used."))
+            
+            return super(PyBoardDevice, self).getWorkspace()
+    
+    def getDocumentationUrl(self):
+        """
+        Public method to get the device documentation URL.
+        
+        @return documentation URL of the device
+        @rtype str
+        """
+        return Preferences.getMicroPython("MicroPythonDocuUrl")
+    
+    def addDeviceMenuEntries(self, menu):
+        """
+        Public method to add device specific entries to the given menu.
+        
+        @param menu reference to the context menu
+        @type QMenu
+        """
+        menu.addAction(
+            self.tr("MicroPython Install Instructions"),
+            self.__showInstallInstructions)
+        # TODO: add entry to flash a new firmware using dfu-util
+    
+    def __showInstallInstructions(self):
+        """
+        Private slot to open the URL containing instructions for installing
+        MicroPython on the pyboard.
+        """
+        e5App().getObject("UserInterface").launchHelpViewer(
+            PyBoardDevice.FlashInstructionsURL)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,191 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing some utility and compatibility functions for working with
+the ast module.
+"""
+
+import sys
+import ast
+
+if sys.version_info >= (3, 8, 0):
+    # functions for Python >= 3.8
+    
+    import numbers
+    
+    def isNumber(node):
+        """
+        Function to check that a node is a number.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a number
+        @rtype bool
+        """
+        return (
+            isinstance(node, ast.Constant) and
+            isinstance(node.value, numbers.Number)
+        )
+    
+    def isString(node):
+        """
+        Function to check that a node is a string.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a string
+        @rtype bool
+        """
+        return (
+            isinstance(node, ast.Constant) and
+            isinstance(node.value, str)
+        )
+    
+    def isBytes(node):
+        """
+        Function to check that a node is a bytes.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a bytes
+        @rtype bool
+        """
+        return (
+            isinstance(node, ast.Constant) and
+            isinstance(node.value, bytes)
+        )
+    
+    def isBaseString(node):
+        """
+        Function to check that a node is a bytes or string.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a bytes or string
+        @rtype bool
+        """
+        return (
+            isinstance(node, ast.Constant) and
+            isinstance(node.value, (bytes, str))
+        )
+    
+    def isNameConstant(node):
+        """
+        Function to check that a node is a name constant.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a name constant
+        @rtype bool
+        """
+        return (
+            isinstance(node, ast.Constant) and
+            not isinstance(node.value, (bytes, str, numbers.Number))
+        )
+    
+    def getValue(node):
+        """
+        Function to extract the value of a node.
+        
+        @param node reference to the node to extract the value from
+        @type ast.Constant
+        @return value of the node
+        @rtype any
+        @exception TypeError raised to indicate an unsupported type
+        """
+        if isinstance(node, ast.Constant):
+            return node.value
+        else:
+            raise TypeError("Illegal node type passed.")
+
+else:
+    # functions for Python < 3.8
+    
+    def isNumber(node):
+        """
+        Function to check that a node is a number.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a number
+        @rtype bool
+        """
+        return isinstance(node, ast.Num)
+    
+    def isString(node):
+        """
+        Function to check that a node is a string.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a string
+        @rtype bool
+        """
+        return isinstance(node, ast.Str)
+    
+    def isBytes(node):
+        """
+        Function to check that a node is a bytes.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a bytes
+        @rtype bool
+        """
+        return (
+            sys.version_info[0] >= 3 and
+            isinstance(node, ast.Bytes)
+        )
+    
+    def isBaseString(node):
+        """
+        Function to check that a node is a bytes or string.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a bytes or string
+        @rtype bool
+        """
+        typ = (ast.Str,)
+        if sys.version_info[0] > 2:
+            typ += (ast.Bytes,)
+        return isinstance(node, typ)
+    
+    def isNameConstant(node):
+        """
+        Function to check that a node is a name constant.
+        
+        @param node reference to the node to check
+        @type ast.AST
+        @return flag indicating a name constant
+        @rtype bool
+        """
+        return isinstance(node, ast.NameConstant)
+    
+    def getValue(node):
+        """
+        Function to extract the value of a node.
+        
+        @param node reference to the node to extract the value from
+        @type one of ast.Num, ast.Str, ast.Bytes or ast.NameConstant
+        @return value of the node
+        @rtype one of str, bytes, int
+        @exception TypeError raised to indicate an unsupported type
+        """
+        if isinstance(node, ast.Num):
+            return node.n
+        
+        elif isinstance(node, ast.Str):
+            return node.s
+        
+        elif sys.version_info[0] > 2 and isinstance(node, ast.Bytes):
+            return node.s
+        
+        elif isinstance(node, ast.NameConstant):
+            return node.value
+        
+        else:
+            raise TypeError("Illegal node type passed.")
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Fri Nov 01 16:11:27 2019 +0100
@@ -15,6 +15,8 @@
 from collections import defaultdict
 import tokenize
 
+import AstUtilities
+
 
 def composeCallPath(node):
     """
@@ -467,10 +469,13 @@
                     node.module == '__future__'):
                 imports |= {name.name for name in node.names}
             elif isinstance(node, ast.Expr):
-                if not isinstance(node.value, ast.Str):
+                if not AstUtilities.isString(node.value):
                     hasCode = True
                     break
-            elif not isinstance(node, (ast.Module, ast.Str)):
+            elif not (
+                AstUtilities.isString(node) or
+                isinstance(node, ast.Module)
+            ):
                 hasCode = True
                 break
 
@@ -879,7 +884,7 @@
         @return flag indicating to check the node
         @rtype bool
         """
-        if not all(isinstance(key, ast.Str) for key in node.keys):
+        if not all(AstUtilities.isString(key) for key in node.keys):
             return False
         
         if (
@@ -1008,20 +1013,6 @@
             node.is_docstring = False
         self.nodes.append(node)
 
-    def __isBaseString(self, node):
-        """
-        Private method to determine, if a node is a base string node.
-        
-        @param node reference to the node to check
-        @type ast.AST
-        @return flag indicating a base string
-        @rtype bool
-        """
-        typ = (ast.Str,)
-        if sys.version_info[0] > 2:
-            typ += (ast.Bytes,)
-        return isinstance(node, typ)
-
     def visit_Str(self, node):
         """
         Public method to record a string node.
@@ -1039,6 +1030,21 @@
         @type ast.Bytes
         """
         self.__addNode(node)
+    
+    def visit_Constant(self, node):
+        """
+        Public method to handle constant nodes.
+        
+        @param node reference to the bytes node
+        @type ast.Constant
+        """
+        if sys.version_info >= (3, 8, 0):
+            if AstUtilities.isBaseString(node):
+                self.__addNode(node)
+            else:
+                super(TextVisitor, self).generic_visit(node)
+        else:
+            super(TextVisitor, self).generic_visit(node)
 
     def __visitDefinition(self, node):
         """
@@ -1065,8 +1071,11 @@
         @param node reference to the node to traverse
         @type ast.AST
         """
-        if (node.body and isinstance(node.body[0], ast.Expr) and
-                self.__isBaseString(node.body[0].value)):
+        if (
+            node.body and
+            isinstance(node.body[0], ast.Expr) and
+            AstUtilities.isBaseString(node.body[0].value)
+        ):
             node.body[0].value.is_docstring = True
 
         for subnode in node.body:
@@ -1118,13 +1127,18 @@
         @param node reference to the node to handle
         @type ast.Call
         """
-        if (isinstance(node.func, ast.Attribute) and
-                node.func.attr == 'format'):
-            if self.__isBaseString(node.func.value):
+        if (
+            isinstance(node.func, ast.Attribute) and
+            node.func.attr == 'format'
+        ):
+            if AstUtilities.isBaseString(node.func.value):
                 self.calls[node.func.value] = (node, False)
-            elif (isinstance(node.func.value, ast.Name) and
-                    node.func.value.id == 'str' and node.args and
-                    self.__isBaseString(node.args[0])):
+            elif (
+                isinstance(node.func.value, ast.Name) and
+                node.func.value.id == 'str' and
+                node.args and
+                AstUtilities.isBaseString(node.args[0])
+            ):
                 self.calls[node.args[0]] = (node, True)
         super(TextVisitor, self).generic_visit(node)
 
@@ -1406,13 +1420,13 @@
                 if (
                     node.func.id == "getattr" and
                     len(node.args) == 2 and
-                    isinstance(node.args[1], ast.Str)
+                    AstUtilities.isString(node.args[1])
                 ):
                     self.violations.append((node, "M512"))
                 elif (
                     node.func.id == "setattr" and
                     len(node.args) == 3 and
-                    isinstance(node.args[1], ast.Str)
+                    AstUtilities.isString(node.args[1])
                 ):
                     self.violations.append((node, "M513"))
             except (AttributeError, IndexError):
@@ -1487,8 +1501,8 @@
         @type ast.Assert
         """
         if (
-            isinstance(node.test, ast.NameConstant) and
-            node.test.value is False
+            AstUtilities.isNameConstant(node.test) and
+            AstUtilities.getValue(node.test) is False
         ):
             self.violations.append((node, "M503"))
         
@@ -1518,10 +1532,10 @@
         if node.func.attr not in ("lstrip", "rstrip", "strip"):
             return          # method name doesn't match
         
-        if len(node.args) != 1 or not isinstance(node.args[0], ast.Str):
+        if len(node.args) != 1 or not AstUtilities.isString(node.args[0]):
             return          # used arguments don't match the builtin strip
         
-        s = node.args[0].s
+        s = AstUtilities.getValue(node.args[0])
         if len(s) == 1:
             return          # stripping just one character
         
@@ -1764,10 +1778,12 @@
         @type ast.AST
         @return flag indicating the node contains a None value
         """
-        try:
-            return isinstance(node, ast.NameConstant) and node.value is None
-        except AttributeError:
-            # try Py2
+        if sys.version_info[0] > 2:
+            return (
+                AstUtilities.isNameConstant(node) and
+                AstUtilities.getValue(node) is None
+            )
+        else:
             return isinstance(node, ast.Name) and node.id == "None"
     
     def __resultExists(self):
@@ -1953,32 +1969,46 @@
             if node.func.attr == 'datetime':
                 # datetime.datetime(2000, 1, 1, 0, 0, 0, 0,
                 #                   datetime.timezone.utc)
-                isCase1 = (len(node.args) >= 8 and
-                           not (isinstance(node.args[7], ast.NameConstant) and
-                                node.args[7].value is None))
+                isCase1 = (
+                    len(node.args) >= 8 and
+                    not (
+                        AstUtilities.isNameConstant(node.args[7]) and
+                        AstUtilities.getValue(node.args[7]) is None
+                    )
+                )
                 
                 # datetime.datetime(2000, 1, 1, tzinfo=datetime.timezone.utc)
                 tzinfoKeyword = self.__getFromKeywords(node.keywords, 'tzinfo')
-                isCase2 = (tzinfoKeyword is not None and
-                           not (isinstance(tzinfoKeyword.value,
-                                           ast.NameConstant) and
-                                tzinfoKeyword.value.value is None))
+                isCase2 = (
+                    tzinfoKeyword is not None and
+                    not (
+                        AstUtilities.isNameConstant(tzinfoKeyword.value) and
+                        AstUtilities.getValue(tzinfoKeyword.value) is None
+                    )
+                )
                 
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M301"))
             
             elif node.func.attr == 'time':
                 # time(12, 10, 45, 0, datetime.timezone.utc)
-                isCase1 = (len(node.args) >= 5 and
-                           not (isinstance(node.args[4], ast.NameConstant) and
-                                node.args[4].value is None))
+                isCase1 = (
+                    len(node.args) >= 5 and
+                    not (
+                        AstUtilities.isNameConstant(node.args[4]) and
+                        AstUtilities.getValue(node.args[4]) is None
+                    )
+                )
                 
                 # datetime.time(12, 10, 45, tzinfo=datetime.timezone.utc)
                 tzinfoKeyword = self.__getFromKeywords(node.keywords, 'tzinfo')
-                isCase2 = (tzinfoKeyword is not None and
-                           not (isinstance(tzinfoKeyword.value,
-                                           ast.NameConstant) and
-                                tzinfoKeyword.value.value is None))
+                isCase2 = (
+                    tzinfoKeyword is not None and
+                    not (
+                        AstUtilities.isNameConstant(tzinfoKeyword.value) and
+                        AstUtilities.getValue(tzinfoKeyword.value) is None
+                    )
+                )
                 
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M321"))
@@ -1998,34 +2028,48 @@
             
             elif node.func.attr in 'now':
                 # datetime.now(UTC)
-                isCase1 = (len(node.args) == 1 and
-                           len(node.keywords) == 0 and
-                           not (isinstance(node.args[0], ast.NameConstant) and
-                                node.args[0].value is None))
+                isCase1 = (
+                    len(node.args) == 1 and
+                    len(node.keywords) == 0 and
+                    not (
+                        AstUtilities.isNameConstant(node.args[0]) and
+                        AstUtilities.getValue(node.args[0]) is None
+                    )
+                )
                 
                 # datetime.now(tz=UTC)
                 tzKeyword = self.__getFromKeywords(node.keywords, 'tz')
-                isCase2 = (tzKeyword is not None and
-                           not (isinstance(tzKeyword.value,
-                                           ast.NameConstant) and
-                                tzKeyword.value.value is None))
+                isCase2 = (
+                    tzKeyword is not None and
+                    not (
+                        AstUtilities.isNameConstant(tzKeyword.value) and
+                        AstUtilities.getValue(tzKeyword.value) is None
+                    )
+                )
                 
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M305"))
             
             elif node.func.attr == 'fromtimestamp':
                 # datetime.fromtimestamp(1234, UTC)
-                isCase1 = (len(node.args) == 2 and
-                           len(node.keywords) == 0 and
-                           not (isinstance(node.args[1], ast.NameConstant) and
-                                node.args[1].value is None))
+                isCase1 = (
+                    len(node.args) == 2 and
+                    len(node.keywords) == 0 and
+                    not (
+                        AstUtilities.isNameConstant(node.args[1]) and
+                        AstUtilities.getValue(node.args[1]) is None
+                    )
+                )
                 
                 # datetime.fromtimestamp(1234, tz=UTC)
                 tzKeyword = self.__getFromKeywords(node.keywords, 'tz')
-                isCase2 = (tzKeyword is not None and
-                           not (isinstance(tzKeyword.value,
-                                           ast.NameConstant) and
-                                tzKeyword.value.value is None))
+                isCase2 = (
+                    tzKeyword is not None and
+                    not (
+                        AstUtilities.isNameConstant(tzKeyword.value) and
+                        AstUtilities.getValue(tzKeyword.value) is None
+                    )
+                )
                 
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M306"))
@@ -2042,10 +2086,14 @@
                 else:
                     tzinfoKeyword = self.__getFromKeywords(pparent.keywords,
                                                            'tzinfo')
-                    isCase1 = (tzinfoKeyword is not None and
-                               not (isinstance(tzinfoKeyword.value,
-                                               ast.NameConstant) and
-                                    tzinfoKeyword.value.value is None))
+                    isCase1 = (
+                        tzinfoKeyword is not None and
+                        not (
+                            AstUtilities.isNameConstant(
+                                tzinfoKeyword.value) and
+                            AstUtilities.getValue(tzinfoKeyword.value) is None
+                        )
+                    )
                 
                 if not isCase1:
                     self.violations.append((node, "M307"))
@@ -2153,8 +2201,8 @@
             self.__isSys("version", node.value) and
             isinstance(node.slice, ast.Slice) and
             node.slice.lower is None and
-            isinstance(node.slice.upper, ast.Num) and
-            node.slice.upper.n == n and
+            AstUtilities.isNumber(node.slice.upper) and
+            AstUtilities.getValue(node.slice.upper) == n and
             node.slice.step is None
         )
     
@@ -2172,15 +2220,15 @@
         elif (
             self.__isSys('version', node.value) and
             isinstance(node.slice, ast.Index) and
-            isinstance(node.slice.value, ast.Num) and
-            node.slice.value.n == 2
+            AstUtilities.isNumber(node.slice.value) and
+            AstUtilities.getValue(node.slice.value) == 2
         ):
             self.violations.append((node.value, "M402"))
         elif (
             self.__isSys('version', node.value) and
             isinstance(node.slice, ast.Index) and
-            isinstance(node.slice.value, ast.Num) and
-            node.slice.value.n == 0
+            AstUtilities.isNumber(node.slice.value) and
+            AstUtilities.getValue(node.slice.value) == 0
         ):
             self.violations.append((node.value, "M421"))
 
@@ -2197,21 +2245,21 @@
             isinstance(node.left, ast.Subscript) and
             self.__isSys('version_info', node.left.value) and
             isinstance(node.left.slice, ast.Index) and
-            isinstance(node.left.slice.value, ast.Num) and
-            node.left.slice.value.n == 0 and
+            AstUtilities.isNumber(node.left.slice.value) and
+            AstUtilities.getValue(node.left.slice.value) == 0 and
             len(node.ops) == 1 and
             isinstance(node.ops[0], ast.Eq) and
-            isinstance(node.comparators[0], ast.Num) and
-            node.comparators[0].n == 3
+            AstUtilities.isNumber(node.comparators[0]) and
+            AstUtilities.getValue(node.comparators[0]) == 3
         ):
             self.violations.append((node.left, "M411"))
         elif (
             self.__isSys('version', node.left) and
             len(node.ops) == 1 and
             isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            isinstance(node.comparators[0], ast.Str)
+            AstUtilities.isString(node.comparators[0])
         ):
-            if len(node.comparators[0].s) == 1:
+            if len(AstUtilities.getValue(node.comparators[0])) == 1:
                 errorCode = "M422"
             else:
                 errorCode = "M403"
@@ -2220,11 +2268,11 @@
             isinstance(node.left, ast.Subscript) and
             self.__isSys('version_info', node.left.value) and
             isinstance(node.left.slice, ast.Index) and
-            isinstance(node.left.slice.value, ast.Num) and
-            node.left.slice.value.n == 1 and
+            AstUtilities.isNumber(node.left.slice.value) and
+            AstUtilities.getValue(node.left.slice.value) == 1 and
             len(node.ops) == 1 and
             isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            isinstance(node.comparators[0], ast.Num)
+            AstUtilities.isNumber(node.comparators[0])
         ):
             self.violations.append((node, "M413"))
         elif (
@@ -2233,7 +2281,7 @@
             node.left.attr == 'minor' and
             len(node.ops) == 1 and
             isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            isinstance(node.comparators[0], ast.Num)
+            AstUtilities.isNumber(node.comparators[0])
         ):
             self.violations.append((node, "M414"))
         
--- a/eric6/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.ui	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.ui	Fri Nov 01 16:11:27 2019 +0100
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="toolTip">
-   <string>Select to perform an expensive copy detection</string>
+   <string/>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
--- a/eric6/Preferences/ConfigurationPages/ApplicationPage.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/ApplicationPage.py	Fri Nov 01 16:11:27 2019 +0100
@@ -35,6 +35,11 @@
             " this is an advanced setting."
         ))
         
+        self.msgSeverityComboBox.addItem(self.tr("Debug"), 0)
+        self.msgSeverityComboBox.addItem(self.tr("Warning"), 1)
+        self.msgSeverityComboBox.addItem(self.tr("Critical"), 2)
+        self.msgSeverityComboBox.addItem(self.tr("Fatal Error"), 3)
+        
         # set initial values
         self.singleApplicationCheckBox.setChecked(
             Preferences.getUI("SingleApplicationMode"))
@@ -78,6 +83,9 @@
         
         self.errorlogCheckBox.setChecked(
             Preferences.getUI("CheckErrorLog"))
+        severityIndex = self.msgSeverityComboBox.findData(
+            Preferences.getUI("MinimumMessageTypeSeverity"))
+        self.msgSeverityComboBox.setCurrentIndex(severityIndex)
         
         self.intervalSpinBox.setValue(
             Preferences.getUI("KeyboardInputInterval"))
@@ -136,6 +144,9 @@
         Preferences.setUI(
             "CheckErrorLog",
             self.errorlogCheckBox.isChecked())
+        Preferences.setUI(
+            "MinimumMessageTypeSeverity",
+            self.msgSeverityComboBox.currentData())
         
         Preferences.setUI(
             "KeyboardInputInterval",
--- a/eric6/Preferences/ConfigurationPages/ApplicationPage.ui	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/ApplicationPage.ui	Fri Nov 01 16:11:27 2019 +0100
@@ -237,6 +237,30 @@
         </property>
        </widget>
       </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <item>
+         <widget class="QLabel" name="label_2">
+          <property name="text">
+           <string>Minimum Severity for message dialog:</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QComboBox" name="msgSeverityComboBox">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Select the minimum message severity shown</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
      </layout>
     </widget>
    </item>
@@ -370,6 +394,7 @@
   <tabstop>monthlyCheckRadioButton</tabstop>
   <tabstop>systemEmailClientCheckBox</tabstop>
   <tabstop>errorlogCheckBox</tabstop>
+  <tabstop>msgSeverityComboBox</tabstop>
   <tabstop>intervalSpinBox</tabstop>
   <tabstop>backgroundServicesSpinBox</tabstop>
  </tabstops>
--- a/eric6/Preferences/ConfigurationPages/EditorFilePage.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorFilePage.py	Fri Nov 01 16:11:27 2019 +0100
@@ -7,12 +7,14 @@
 Module implementing the Editor File Handling configuration page.
 """
 
+import sys
 
 from PyQt5.QtCore import pyqtSlot
 from PyQt5.QtWidgets import QListWidgetItem, QInputDialog, QLineEdit
 from PyQt5.Qsci import QsciScintilla
 
 from E5Gui import E5MessageBox
+from E5Gui.E5Application import e5App
 
 from .ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EditorFilePage import Ui_EditorFilePage
@@ -86,26 +88,38 @@
         elif eolMode == QsciScintilla.EolUnix:
             self.lfRadioButton.setChecked(True)
         
+        self.previewRefreshTimeoutSpinBox.setValue(
+            Preferences.getEditor("PreviewRefreshWaitTimer"))
+        
         self.previewHtmlExtensionsEdit.setText(
             " ".join(Preferences.getEditor("PreviewHtmlFileNameExtensions")))
+        
         self.previewMarkdownExtensionsEdit.setText(
             " ".join(
                 Preferences.getEditor("PreviewMarkdownFileNameExtensions")))
-        self.previewRestExtensionsEdit.setText(
-            " ".join(Preferences.getEditor("PreviewRestFileNameExtensions")))
-        self.previewQssExtensionsEdit.setText(
-            " ".join(Preferences.getEditor("PreviewQssFileNameExtensions")))
         self.previewRestSphinxCheckBox.setChecked(
             Preferences.getEditor("PreviewRestUseSphinx"))
         self.previewMarkdownNLtoBreakCheckBox.setChecked(
             Preferences.getEditor("PreviewMarkdownNLtoBR"))
+        self.previewMarkdownPyMdownCheckBox.setChecked(
+            Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions"))
+        self.previewMarkdownMathJaxCheckBox.setChecked(
+            Preferences.getEditor("PreviewMarkdownMathJax"))
+        self.previewMarkdownMermaidCheckBox.setChecked(
+            Preferences.getEditor("PreviewMarkdownMermaid"))
         index = self.previewMarkdownHTMLFormatComboBox.findText(
             Preferences.getEditor("PreviewMarkdownHTMLFormat"))
         self.previewMarkdownHTMLFormatComboBox.setCurrentIndex(index)
+        
+        self.previewRestExtensionsEdit.setText(
+            " ".join(Preferences.getEditor("PreviewRestFileNameExtensions")))
         index = self.previewRestDocutilsHTMLFormatComboBox.findText(
             Preferences.getEditor("PreviewRestDocutilsHTMLFormat"))
         self.previewRestDocutilsHTMLFormatComboBox.setCurrentIndex(index)
         
+        self.previewQssExtensionsEdit.setText(
+            " ".join(Preferences.getEditor("PreviewQssFileNameExtensions")))
+        
     def save(self):
         """
         Public slot to save the Editor File Handling configuration.
@@ -160,33 +174,49 @@
         Preferences.setEditor("AdditionalSaveFilters", self.saveFileFilters)
         
         Preferences.setEditor(
+            "PreviewRefreshWaitTimer",
+            self.previewRefreshTimeoutSpinBox.value())
+        
+        Preferences.setEditor(
             "PreviewHtmlFileNameExtensions",
             [ext.strip() for ext in
              self.previewHtmlExtensionsEdit.text().split()])
+        
         Preferences.setEditor(
             "PreviewMarkdownFileNameExtensions",
             [ext.strip() for ext in
              self.previewMarkdownExtensionsEdit.text().split()])
         Preferences.setEditor(
-            "PreviewRestFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewRestExtensionsEdit.text().split()])
-        Preferences.setEditor(
-            "PreviewQssFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewQssExtensionsEdit.text().split()])
-        Preferences.setEditor(
             "PreviewRestUseSphinx",
             self.previewRestSphinxCheckBox.isChecked())
         Preferences.setEditor(
             "PreviewMarkdownNLtoBR",
             self.previewMarkdownNLtoBreakCheckBox.isChecked())
         Preferences.setEditor(
+            "PreviewMarkdownUsePyMdownExtensions",
+            self.previewMarkdownPyMdownCheckBox.isChecked())
+        Preferences.setEditor(
+            "PreviewMarkdownMathJax",
+            self.previewMarkdownMathJaxCheckBox.isChecked())
+        Preferences.setEditor(
+            "PreviewMarkdownMermaid",
+            self.previewMarkdownMermaidCheckBox.isChecked())
+        Preferences.setEditor(
             "PreviewMarkdownHTMLFormat",
             self.previewMarkdownHTMLFormatComboBox.currentText())
+        
+        Preferences.setEditor(
+            "PreviewRestFileNameExtensions",
+            [ext.strip() for ext in
+             self.previewRestExtensionsEdit.text().split()])
         Preferences.setEditor(
             "PreviewRestDocutilsHTMLFormat",
             self.previewRestDocutilsHTMLFormatComboBox.currentText())
+        
+        Preferences.setEditor(
+            "PreviewQssFileNameExtensions",
+            [ext.strip() for ext in
+             self.previewQssExtensionsEdit.text().split()])
     
     def __setDefaultFiltersLists(self, keepSelection=False):
         """
@@ -327,6 +357,14 @@
         self.editFileFilterButton.setEnabled(current is not None)
         self.deleteFileFilterButton.setEnabled(current is not None)
     
+    @pyqtSlot()
+    def on_previewMarkdownPyMdownInstallPushButton_clicked(self):
+        """
+        Private slot to install the pymdown extensions package via pip.
+        """
+        pip = e5App().getObject("Pip")
+        pip.installPackages(["pymdown-extensions"], interpreter=sys.executable)
+    
 
 def create(dlg):
     """
--- a/eric6/Preferences/ConfigurationPages/EditorFilePage.ui	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorFilePage.ui	Fri Nov 01 16:11:27 2019 +0100
@@ -7,10 +7,10 @@
     <x>0</x>
     <y>0</y>
     <width>600</width>
-    <height>1622</height>
+    <height>1739</height>
    </rect>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_4">
+  <layout class="QVBoxLayout" name="verticalLayout_5">
    <item>
     <widget class="QLabel" name="headerLabel">
      <property name="text">
@@ -454,7 +454,50 @@
      <property name="title">
       <string>File Preview</string>
      </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
+     <layout class="QVBoxLayout" name="verticalLayout_4">
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_5">
+        <item>
+         <widget class="QLabel" name="label_8">
+          <property name="text">
+           <string>Refresh Timeout:</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QSpinBox" name="previewRefreshTimeoutSpinBox">
+          <property name="toolTip">
+           <string>Enter the timeout in milliseconds until the preview is refreshed</string>
+          </property>
+          <property name="suffix">
+           <string> ms</string>
+          </property>
+          <property name="minimum">
+           <number>500</number>
+          </property>
+          <property name="maximum">
+           <number>5000</number>
+          </property>
+          <property name="singleStep">
+           <number>500</number>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
       <item>
        <widget class="QGroupBox" name="groupBox_12">
         <property name="title">
@@ -464,7 +507,7 @@
          <item>
           <widget class="QLabel" name="label_12">
            <property name="text">
-            <string>Extensions:</string>
+            <string>File Extensions:</string>
            </property>
           </widget>
          </item>
@@ -483,50 +526,119 @@
         <property name="title">
          <string>Markdown Files</string>
         </property>
-        <layout class="QGridLayout" name="gridLayout_4">
-         <item row="0" column="0">
-          <widget class="QLabel" name="label_11">
-           <property name="text">
-            <string>Extensions:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1" colspan="2">
-          <widget class="QLineEdit" name="previewMarkdownExtensionsEdit">
-           <property name="toolTip">
-            <string>Enter the filename extensions of Markdown files that may be previewed (separated by a space)</string>
-           </property>
-          </widget>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <layout class="QGridLayout" name="gridLayout_4">
+           <item row="0" column="0">
+            <widget class="QLabel" name="label_11">
+             <property name="text">
+              <string>File Extensions:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="0" column="1">
+            <widget class="QLineEdit" name="previewMarkdownExtensionsEdit">
+             <property name="toolTip">
+              <string>Enter the filename extensions of Markdown files that may be previewed (separated by a space)</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QLabel" name="label_6">
+             <property name="text">
+              <string>HTML Format:</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="1">
+            <widget class="QComboBox" name="previewMarkdownHTMLFormatComboBox">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="toolTip">
+              <string>Select the HTML format to be generated</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
          </item>
-         <item row="1" column="0" colspan="3">
-          <widget class="QCheckBox" name="previewMarkdownNLtoBreakCheckBox">
-           <property name="toolTip">
-            <string>Select this to convert a new line character to an HTML &amp;lt;br/&amp;gt; tag.</string>
-           </property>
-           <property name="text">
-            <string>Convert New Line to HTML Break</string>
-           </property>
-          </widget>
+         <item>
+          <layout class="QGridLayout" name="gridLayout_5">
+           <item row="0" column="0">
+            <widget class="QCheckBox" name="previewMarkdownNLtoBreakCheckBox">
+             <property name="toolTip">
+              <string>Select this to convert a new line character to an HTML &amp;lt;br/&amp;gt; tag.</string>
+             </property>
+             <property name="text">
+              <string>Convert New Line to HTML Break</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QCheckBox" name="previewMarkdownMathJaxCheckBox">
+             <property name="toolTip">
+              <string>Select to enable Math support using MathJax</string>
+             </property>
+             <property name="text">
+              <string>Enable Math support</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="1">
+            <widget class="QCheckBox" name="previewMarkdownMermaidCheckBox">
+             <property name="toolTip">
+              <string>Select to enable Graph support using Mermaid</string>
+             </property>
+             <property name="text">
+              <string>Enable Graph support</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
          </item>
-         <item row="2" column="0" colspan="2">
-          <widget class="QLabel" name="label_6">
-           <property name="text">
-            <string>HTML Format:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="2" column="2">
-          <widget class="QComboBox" name="previewMarkdownHTMLFormatComboBox">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="toolTip">
-            <string>Select the HTML format to be generated</string>
-           </property>
-          </widget>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_6">
+           <item>
+            <widget class="QCheckBox" name="previewMarkdownPyMdownCheckBox">
+             <property name="toolTip">
+              <string>Select to enable the use of the PyMdown extensions</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;b&gt;Enable PyMdown Extensions&lt;/b&gt;
+&lt;p&gt;Select this entry to enable the use of the PyMdown extensions. These have to be installed with &lt;code&gt;pip install pymdown-extensions&lt;/code&gt;.&lt;/p&gt;</string>
+             </property>
+             <property name="text">
+              <string>Enable PyMdown Extensions</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="previewMarkdownPyMdownInstallPushButton">
+             <property name="toolTip">
+              <string>Press to install the PyMdown extensions</string>
+             </property>
+             <property name="text">
+              <string>Install PyMdown Extensions</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
          </item>
         </layout>
        </widget>
@@ -540,7 +652,7 @@
          <item row="0" column="0">
           <widget class="QLabel" name="label_9">
            <property name="text">
-            <string>Extensions:</string>
+            <string>File Extensions:</string>
            </property>
           </widget>
          </item>
@@ -602,7 +714,7 @@
          <item>
           <widget class="QLabel" name="label_10">
            <property name="text">
-            <string>Extensions:</string>
+            <string>File Extensions:</string>
            </property>
           </widget>
          </item>
@@ -656,10 +768,15 @@
   <tabstop>addFileFilterButton</tabstop>
   <tabstop>editFileFilterButton</tabstop>
   <tabstop>deleteFileFilterButton</tabstop>
+  <tabstop>previewRefreshTimeoutSpinBox</tabstop>
   <tabstop>previewHtmlExtensionsEdit</tabstop>
   <tabstop>previewMarkdownExtensionsEdit</tabstop>
+  <tabstop>previewMarkdownHTMLFormatComboBox</tabstop>
   <tabstop>previewMarkdownNLtoBreakCheckBox</tabstop>
-  <tabstop>previewMarkdownHTMLFormatComboBox</tabstop>
+  <tabstop>previewMarkdownMathJaxCheckBox</tabstop>
+  <tabstop>previewMarkdownMermaidCheckBox</tabstop>
+  <tabstop>previewMarkdownPyMdownCheckBox</tabstop>
+  <tabstop>previewMarkdownPyMdownInstallPushButton</tabstop>
   <tabstop>previewRestExtensionsEdit</tabstop>
   <tabstop>previewRestSphinxCheckBox</tabstop>
   <tabstop>previewRestDocutilsHTMLFormatComboBox</tabstop>
--- a/eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Fri Nov 01 16:11:27 2019 +0100
@@ -1,5 +1,8 @@
 # -*- coding: utf-8 -*-
 
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
 """
 Module implementing a dialog to set the tab and indentation width override for
 a language.
@@ -14,7 +17,8 @@
 
 
 class EditorLanguageTabIndentOverrideDialog(
-    QDialog, Ui_EditorLanguageTabIndentOverrideDialog):
+    QDialog, Ui_EditorLanguageTabIndentOverrideDialog
+):
     """
     Class implementing a dialog to set the tab and indentation width override
     for a language.
@@ -24,16 +28,16 @@
         """
         Constructor
         
-        @param editMode flag indicating the edit mode (Note: in edit mode
+        @keyparam editMode flag indicating the edit mode (Note: in edit mode
             the language is fixed)
         @type bool
-        @param languages list of available languages
+        @keyparam languages list of available languages
         @type list of str
-        @param tabWidth tab width to be set
+        @keyparam tabWidth tab width to be set
         @type int
-        @param indentWidth indentation width to be set
+        @keyparam indentWidth indentation width to be set
         @type int
-        @param parent reference to the parent widget
+        @keyparam parent reference to the parent widget
         @type QWidget
         """
         super(EditorLanguageTabIndentOverrideDialog, self).__init__(parent)
--- a/eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.py	Fri Nov 01 16:11:27 2019 +0100
@@ -55,8 +55,12 @@
         
         self.stringsOnlyCheckBox.setChecked(
             Preferences.getEditor("SpellCheckStringsOnly"))
+        self.fullCheckUnknownCheckBox.setChecked(
+            Preferences.getEditor("FullSpellCheckUnknown"))
         self.minimumWordSizeSlider.setValue(
             Preferences.getEditor("SpellCheckingMinWordSize"))
+        self.spellCheckTextFilesLineEdit.setText(
+            " ".join(Preferences.getEditor("FullSpellCheckExtensions")))
         
         self.initColour(
             "SpellingMarkers", self.spellingMarkerButton,
@@ -89,7 +93,14 @@
         Preferences.setEditor(
             "SpellCheckStringsOnly", self.stringsOnlyCheckBox.isChecked())
         Preferences.setEditor(
+            "FullSpellCheckUnknown",
+            self.fullCheckUnknownCheckBox.isChecked())
+        Preferences.setEditor(
             "SpellCheckingMinWordSize", self.minimumWordSizeSlider.value())
+        Preferences.setEditor(
+            "FullSpellCheckExtensions",
+            [ext.strip() for ext in
+             self.spellCheckTextFilesLineEdit.text().split()])
         
         self.saveColours(Preferences.setEditorColour)
         
--- a/eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.ui	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.ui	Fri Nov 01 16:11:27 2019 +0100
@@ -112,14 +112,28 @@
         </property>
         <layout class="QVBoxLayout" name="verticalLayout">
          <item>
-          <widget class="QCheckBox" name="stringsOnlyCheckBox">
-           <property name="toolTip">
-            <string>Select to check strings only</string>
-           </property>
-           <property name="text">
-            <string>Spell check strings only</string>
-           </property>
-          </widget>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <item>
+            <widget class="QCheckBox" name="stringsOnlyCheckBox">
+             <property name="toolTip">
+              <string>Select to check strings only</string>
+             </property>
+             <property name="text">
+              <string>Spell check strings only</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="fullCheckUnknownCheckBox">
+             <property name="toolTip">
+              <string>Select to perform a complete check of files without extension</string>
+             </property>
+             <property name="text">
+              <string>Spell check unknown files</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
          </item>
          <item>
           <layout class="QHBoxLayout" name="horizontalLayout">
@@ -153,7 +167,7 @@
             </widget>
            </item>
            <item>
-            <widget class="QLCDNumber" name="lCDNumber">
+            <widget class="QLCDNumber" name="lcdNumber">
              <property name="toolTip">
               <string>Displays the minimum size of words to be checked</string>
              </property>
@@ -170,6 +184,28 @@
            </item>
           </layout>
          </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <item>
+            <widget class="QLabel" name="label_8">
+             <property name="text">
+              <string>Textfiles:</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="E5ClearableLineEdit" name="spellCheckTextFilesLineEdit">
+             <property name="toolTip">
+              <string>Enter the file extensions of pure text files (separated by a space)</string>
+             </property>
+             <property name="whatsThis">
+              <string>&lt;b&gt;Textfiles&lt;/b&gt;
+&lt;p&gt;Enter the file extension of pure text files. The complete contents of files with these extensions will be checked.&lt;/p&gt;</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
         </layout>
        </widget>
       </item>
@@ -365,12 +401,19 @@
    <header>E5Gui/E5PathPicker.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>E5ClearableLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>E5Gui/E5LineEdit.h</header>
+  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>checkingEnabledCheckBox</tabstop>
   <tabstop>defaultLanguageCombo</tabstop>
   <tabstop>stringsOnlyCheckBox</tabstop>
+  <tabstop>fullCheckUnknownCheckBox</tabstop>
   <tabstop>minimumWordSizeSlider</tabstop>
+  <tabstop>spellCheckTextFilesLineEdit</tabstop>
   <tabstop>spellingMarkerButton</tabstop>
   <tabstop>pwlPicker</tabstop>
   <tabstop>pelPicker</tabstop>
@@ -382,7 +425,7 @@
   <connection>
    <sender>minimumWordSizeSlider</sender>
    <signal>valueChanged(int)</signal>
-   <receiver>lCDNumber</receiver>
+   <receiver>lcdNumber</receiver>
    <slot>display(int)</slot>
    <hints>
     <hint type="sourcelabel">
--- a/eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py	Fri Nov 01 16:11:27 2019 +0100
@@ -11,12 +11,13 @@
 from PyQt5.QtCore import pyqtSlot
 
 from .ConfigurationPageBase import ConfigurationPageBase
-from .Ui_HelpVirusTotalPage import Ui_HelpVirusTotalPage
+from .Ui_WebBrowserVirusTotalPage import Ui_WebBrowserVirusTotalPage
 
 import Preferences
 
 
-class WebBrowserVirusTotalPage(ConfigurationPageBase, Ui_HelpVirusTotalPage):
+class WebBrowserVirusTotalPage(ConfigurationPageBase,
+                               Ui_WebBrowserVirusTotalPage):
     """
     Class implementing VirusTotal configuration page (web browser variant).
     """
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.ui	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WebBrowserVirusTotalPage</class>
+ <widget class="QWidget" name="WebBrowserVirusTotalPage">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>485</width>
+    <height>409</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QLabel" name="headerLabel">
+     <property name="text">
+      <string>&lt;b&gt;Configure VirusTotal Interface&lt;/b&gt;</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="Line" name="line17">
+     <property name="frameShape">
+      <enum>QFrame::HLine</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Sunken</enum>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="vtEnabledCheckBox">
+     <property name="toolTip">
+      <string>Select to enable the VirusTotal interface</string>
+     </property>
+     <property name="text">
+      <string>Enable VirusTotal</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Service Key</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <widget class="QLabel" name="label">
+        <property name="text">
+         <string>Enter your personal VirusTotal service key (s. &lt;a href=&quot;http://virustotal.com&quot;&gt;VirusTotal &amp;copy;&lt;/a&gt; for details):</string>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+        <property name="openExternalLinks">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLineEdit" name="vtServiceKeyEdit">
+        <property name="toolTip">
+         <string>Enter the VirusTotal service key</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="testResultLabel">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <item>
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QPushButton" name="testButton">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="toolTip">
+           <string>Press to test the validity of the service key</string>
+          </property>
+          <property name="text">
+           <string>Test Service Key</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer_2">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QCheckBox" name="vtSecureCheckBox">
+     <property name="toolTip">
+      <string>Select to use a secure (https) connection</string>
+     </property>
+     <property name="text">
+      <string>Use secure (https) connections</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>74</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>vtEnabledCheckBox</tabstop>
+  <tabstop>vtServiceKeyEdit</tabstop>
+  <tabstop>testButton</tabstop>
+  <tabstop>vtSecureCheckBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
--- a/eric6/Preferences/__init__.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/Preferences/__init__.py	Fri Nov 01 16:11:27 2019 +0100
@@ -232,6 +232,10 @@
         "DownloadPath": "",
         "RequestDownloadFilename": True,
         "CheckErrorLog": True,
+        "MinimumMessageTypeSeverity": 2,    # 0 = QtDebugMsg
+                                            # 1 = QtWarningMsg
+                                            # 2 = QtCriticalMsg, QtSystemMsg
+                                            # 3 = QtFatalMsg
         
         "LogStdErrColour": QColor(Qt.red),
         "NotificationsEnabled": True,
@@ -458,6 +462,8 @@
         "SpellCheckingDefaultLanguage": "en_US",
         "SpellCheckingPersonalWordList": "",
         "SpellCheckingPersonalExcludeList": "",
+        "FullSpellCheckExtensions": ["md", "markdown", "rst", "txt"],
+        "FullSpellCheckUnknown": False,
         
         "DefaultEncoding": "utf-8",
         "DefaultOpenFilter": QCoreApplication.translate(
@@ -469,13 +475,17 @@
         
         "ZoomFactor": 0,
         
+        "PreviewRefreshWaitTimer": 500,     # wait time in milliseconds
         "PreviewHtmlFileNameExtensions": ["html", "htm", "svg", "asp", "kid"],
         "PreviewMarkdownFileNameExtensions": ["md", "markdown"],
         "PreviewRestFileNameExtensions": ["rst"],
         "PreviewQssFileNameExtensions": ["qss"],
         "PreviewRestUseSphinx": False,
-        "PreviewMarkdownNLtoBR": True,
-        "PreviewMarkdownHTMLFormat": "XHTML1",  # XHTML1, HTML4, HTML5
+        "PreviewMarkdownNLtoBR": False,
+        "PreviewMarkdownUsePyMdownExtensions": True,
+        "PreviewMarkdownMathJax": True,
+        "PreviewMarkdownMermaid": True,
+        "PreviewMarkdownHTMLFormat": "HTML5",  # XHTML1, HTML4, HTML5
         "PreviewRestDocutilsHTMLFormat": "HTML5",   # HTML4, HTML5
         
         "VirtualSpaceOptions": QsciScintilla.SCVS_NONE,
@@ -1867,7 +1877,7 @@
                  "ProxyType/Ftp", "OpenOnStartup",
                  "PerformVersionCheck", "RecentNumber", "NotificationTimeout",
                  "SidebarDelay", "KeyboardInputInterval",
-                 "BackgroundServiceProcesses"]:
+                 "BackgroundServiceProcesses", "MinimumMessageTypeSeverity"]:
         return int(prefClass.settings.value(
             "UI/" + key, prefClass.uiDefaults[key]))
     elif key in ["ProxyPassword/Http", "ProxyPassword/Https",
@@ -2035,14 +2045,16 @@
                  "PostScriptLevel", "EOLMode", "ZoomFactor", "WhitespaceSize",
                  "OnlineSyntaxCheckInterval", "OnlineChangeTraceInterval",
                  "WrapLongLinesMode", "WrapVisualFlag", "WrapIndentMode",
-                 "WrapStartIndent", "CallTipsPosition", "VirtualSpaceOptions"]:
+                 "WrapStartIndent", "CallTipsPosition", "VirtualSpaceOptions",
+                 "PreviewRefreshWaitTimer"]:
         return int(prefClass.settings.value(
             "Editor/" + key, prefClass.editorDefaults[key]))
     elif key in ["AdditionalOpenFilters", "AdditionalSaveFilters",
                  "PreviewMarkdownFileNameExtensions",
                  "PreviewRestFileNameExtensions",
                  "PreviewHtmlFileNameExtensions",
-                 "PreviewQssFileNameExtensions"]:
+                 "PreviewQssFileNameExtensions",
+                 "FullSpellCheckExtensions"]:
         return toList(prefClass.settings.value(
             "Editor/" + key, prefClass.editorDefaults[key]))
     elif key in ["PythonBadIndentation"]:
--- a/eric6/QScintilla/Editor.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/QScintilla/Editor.py	Fri Nov 01 16:11:27 2019 +0100
@@ -29,6 +29,7 @@
 
 from .QsciScintillaCompat import QsciScintillaCompat, QSCINTILLA_VERSION
 from .EditorMarkerMap import EditorMarkerMap
+from .SpellChecker import SpellChecker
 
 import Preferences
 import Utilities
@@ -82,6 +83,8 @@
         string is passed as a parameter.
     @signal encodingChanged(str) emitted when the editors encoding was set. The
             encoding name is passed as a parameter.
+    @signal spellLanguageChanged(str) emitted when the editor spell check
+            language was set. The language is passed as a parameter.
     @signal lastEditPositionAvailable() emitted when a last edit position is
         available
     @signal refreshed() emitted to signal a refresh of the editor contents
@@ -110,6 +113,7 @@
     languageChanged = pyqtSignal(str)
     eolChanged = pyqtSignal(str)
     encodingChanged = pyqtSignal(str)
+    spellLanguageChanged = pyqtSignal(str)
     lastEditPositionAvailable = pyqtSignal()
     refreshed = pyqtSignal()
     settingsRead = pyqtSignal()
@@ -173,7 +177,7 @@
         
         self.dbs = dbs
         self.taskViewer = tv
-        self.fileName = fn
+        self.__setFileName(fn)
         self.vm = vm
         self.filetype = filetype
         self.filetypeByFlag = False
@@ -202,6 +206,7 @@
         self.showingNotcoveredMarkers = False
         
         self.lexer_ = None
+        self.apiLanguage = ''
         
         self.__loadEditorConfig()
         
@@ -209,7 +214,6 @@
         self.__lexerReset = False
         self.completer = None
         self.encoding = self.__getEditorConfig("DefaultEncoding")
-        self.apiLanguage = ''
         self.lastModified = 0
         self.line = -1
         self.inReopenPrompt = False
@@ -480,10 +484,13 @@
         if editor is None:
             self.__checkLanguage()
             self.__checkEncoding()
+            self.__checkSpellLanguage()
         else:
             # it's a clone
             self.__languageChanged(editor.apiLanguage, propagate=False)
             self.__encodingChanged(editor.encoding, propagate=False)
+            self.__spellLanguageChanged(editor.getSpellingLanguage(),
+                                        propagate=False)
         
         self.setAcceptDrops(True)
         
@@ -528,6 +535,22 @@
         self.SCN_ZOOM.connect(self.__markerMap.update)
         self.__markerMap.update()
     
+    def __setFileName(self, name):
+        """
+        Private method to set the file name of the current file.
+        
+        @param name name of the current file
+        @type str
+        """
+        self.fileName = name
+        
+        if self.fileName:
+            self.__fileNameExtension = (
+                os.path.splitext(self.fileName)[1][1:].lower()
+            )
+        else:
+            self.__fileNameExtension = ""
+    
     def __registerImages(self):
         """
         Private method to register images for autocompletion lists.
@@ -576,6 +599,7 @@
         editor.languageChanged.connect(self.languageChanged)
         editor.eolChanged.connect(self.__eolChanged)
         editor.encodingChanged.connect(self.__encodingChanged)
+        editor.spellLanguageChanged.connect(self.__spellLanguageChanged)
         
     def removeClone(self, editor):
         """
@@ -589,6 +613,7 @@
             editor.languageChanged.disconnect(self.languageChanged)
             editor.eolChanged.disconnect(self.__eolChanged)
             editor.encodingChanged.disconnect(self.__encodingChanged)
+            editor.spellLanguageChanged.disconnect(self.__spellLanguageChanged)
             self.__clones.remove(editor)
         
     def isClone(self, editor):
@@ -747,6 +772,8 @@
         self.__menus["Eol"] = self.eolMenu
         self.encodingsMenu = self.__initContextMenuEncodings()
         self.__menus["Encodings"] = self.encodingsMenu
+        self.spellLanguagesMenu = self.__initContextMenuSpellLanguages()
+        self.__menus["SpellLanguages"] = self.spellLanguagesMenu
         
         self.menuActs["Undo"] = self.menu.addAction(
             UI.PixmapCache.getIcon("editUndo.png"),
@@ -809,6 +836,8 @@
         self.menuActs["SpellCheckRemove"] = self.menu.addAction(
             self.tr("Remove from dictionary"),
             self.__removeFromSpellingDictionary)
+        self.menuActs["SpellCheckLanguages"] = self.menu.addMenu(
+            self.spellLanguagesMenu)
         self.menu.addSeparator()
         self.menu.addAction(
             self.tr('Shorten empty lines'), self.shortenEmptyLines)
@@ -1126,7 +1155,39 @@
         menu.aboutToShow.connect(self.__showContextMenuEol)
         
         return menu
-        
+    
+    def __initContextMenuSpellLanguages(self):
+        """
+        Private method to setup the spell checking languages context sub menu.
+        
+        @return reference to the generated menu
+        @rtype QMenu
+        """
+        self.supportedSpellLanguages = {}
+        
+        menu = QMenu(self.tr("Spell Check Languages"))
+        
+        self.spellLanguagesActGrp = QActionGroup(self)
+        
+        self.noSpellLanguageAct = menu.addAction(
+            self.tr("No Language"))
+        self.noSpellLanguageAct.setCheckable(True)
+        self.noSpellLanguageAct.setData("")
+        self.spellLanguagesActGrp.addAction(self.noSpellLanguageAct)
+        menu.addSeparator()
+        
+        for language in sorted(SpellChecker.getAvailableLanguages()):
+            act = menu.addAction(language)
+            act.setCheckable(True)
+            act.setData(language)
+            self.supportedSpellLanguages[language] = act
+            self.spellLanguagesActGrp.addAction(act)
+        
+        menu.triggered.connect(self.__spellLanguagesMenuTriggered)
+        menu.aboutToShow.connect(self.__showContextMenuSpellLanguages)
+        
+        return menu
+    
     def __initContextMenuExporters(self):
         """
         Private method used to setup the Exporters context sub menu.
@@ -1597,7 +1658,52 @@
             eol = self.getLineSeparator()
             self.eolChanged.emit(eol)
             self.inEolChanged = False
-        
+    
+    def __showContextMenuSpellLanguages(self):
+        """
+        Private slot handling the aboutToShow signal of the spell check
+        languages context menu.
+        """
+        self.showMenu.emit("SpellLanguage", self.spellLanguagesMenu, self)
+    
+    def __spellLanguagesMenuTriggered(self, act):
+        """
+        Private method to handle the selection of a spell check language.
+        
+        @param act reference to the action that was triggered
+        @type QAction
+        """
+        language = act.data()
+        self.__setSpellingLanguage(language)
+        self.spellLanguageChanged.emit(language)
+    
+    def __checkSpellLanguage(self):
+        """
+        Private slot to check the selected spell check language action.
+        """
+        language = self.getSpellingLanguage()
+        try:
+            self.supportedSpellLanguages[language].setChecked(True)
+        except (AttributeError, KeyError):
+            pass
+    
+    def __spellLanguageChanged(self, language, propagate=True):
+        """
+        Private slot to handle a change of the spell check language.
+        
+        @param language new spell check language
+        @type str
+        @param propagate flag indicating to propagate the change
+        @type bool
+        """
+        self.__setSpellingLanguage(language)
+        self.__checkSpellLanguage(language)
+        
+        if not self.__inSpellLanguageChanged and propagate:
+            self.__inSpellLanguageChanged = True
+            self.spellLanguageChanged.emit(language)
+            self.__inSpellLanguageChanged = False
+    
     def __bindLexer(self, filename, pyname=""):
         """
         Private slot to set the correct lexer depending on language.
@@ -3261,7 +3367,7 @@
         if self.writeFile(fn):
             if saveas:
                 self.__clearBreakpoints(self.fileName)
-            self.fileName = fn
+            self.__setFileName(fn)
             self.setModified(False)
             self.setReadOnly(False)
             self.setWindowTitle(self.fileName)
@@ -3318,7 +3424,7 @@
         """
         self.__clearBreakpoints(fn)
         
-        self.fileName = fn
+        self.__setFileName(fn)
         self.setWindowTitle(self.fileName)
         
         self.__loadEditorConfig()
@@ -5351,13 +5457,13 @@
             self.menuActs["codeInfo"].setEnabled(
                 self.vm.isEditorInfoSupported(self.getLanguage()))
         
-        from .SpellChecker import SpellChecker
         spellingAvailable = SpellChecker.isAvailable()
         self.menuActs["SpellCheck"].setEnabled(spellingAvailable)
         self.menuActs["SpellCheckSelection"].setEnabled(
             spellingAvailable and self.hasSelectedText())
         self.menuActs["SpellCheckRemove"].setEnabled(
             spellingAvailable and self.spellingMenuPos >= 0)
+        self.menuActs["SpellCheckLanguages"].setEnabled(spellingAvailable)
         
         if self.menuActs["OpenRejections"]:
             if self.fileName:
@@ -7548,6 +7654,18 @@
     ## Spell checking related methods
     #######################################################################
     
+    def getSpellingLanguage(self):
+        """
+        Public method to get the current spelling language.
+        
+        @return current spelling language
+        @rtype str
+        """
+        if self.spell:
+            return self.spell.getLanguage()
+        
+        return ""
+    
     def __setSpellingLanguage(self, language, pwl="", pel=""):
         """
         Private slot to set the spell checking language.
@@ -7568,7 +7686,6 @@
             self.__spellCheckStringsOnly = Preferences.getEditor(
                 "SpellCheckStringsOnly")
             if self.spell is None:
-                from .SpellChecker import SpellChecker
                 self.spell = SpellChecker(self, self.spellingIndicator,
                                           checkRegion=self.isSpellCheckRegion)
             self.setSpellingForProject()
@@ -7617,16 +7734,35 @@
         Public method to check, if the given position is within a region, that
         should be spell checked.
         
-        @param pos position to be checked (integer)
-        @return flag indicating pos is in a spell check region (boolean)
+        For files with a configured full text file extension all regions will
+        be regarded as to be checked. Depending on configuration, all unknown
+        files (i.e. those without a file extension) will be checked fully as
+        well.
+        
+        @param pos position to be checked
+        @type int
+        @return flag indicating pos is in a spell check region
+        @rtype bool
         """
         if self.__spellCheckStringsOnly:
-            style = self.styleAt(pos)
-            if self.lexer_ is not None:
-                return (
-                    self.lexer_.isCommentStyle(style) or
-                    self.lexer_.isStringStyle(style)
-                )
+            if (
+                self.__fileNameExtension in
+                Preferences.getEditor("FullSpellCheckExtensions")
+            ):
+                return True
+            elif (
+                not self.__fileNameExtension and
+                Preferences.getEditor("FullSpellCheckUnknown")
+            ):
+                return True
+            else:
+                style = self.styleAt(pos)
+                if self.lexer_ is not None:
+                    return (
+                        self.lexer_.isCommentStyle(style) or
+                        self.lexer_.isStringStyle(style)
+                    )
+        
         return True
     
     @pyqtSlot(int)
@@ -8428,11 +8564,12 @@
         """
         if option in ("TabWidth", "IndentWidth"):
             overrides = Preferences.getEditor("TabIndentOverride")
-            if self.filetype in overrides:
+            language = self.filetype or self.apiLanguage
+            if language in overrides:
                 if option == "TabWidth":
-                    return overrides[self.filetype][0]
+                    return overrides[language][0]
                 elif option == "IndentWidth":
-                    return overrides[self.filetype][1]
+                    return overrides[language][1]
         
         return None
     
--- a/eric6/QScintilla/Exporters/ExporterHTML.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/QScintilla/Exporters/ExporterHTML.py	Fri Nov 01 16:11:27 2019 +0100
@@ -525,56 +525,79 @@
             )
             return ""
         
-        try:
-            import mdx_mathjax  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
-        except ImportError:
-            # mathjax doesn't require import statement if installed as
-            # extension
-            pass
+        from UI.Previewers import PreviewerHTMLStyles
+        from UI.Previewers import MarkdownExtensions
+        
+        extensions = []
+        
+        text = self.editor.text()
+        
+        mermaidNeeded = False
+        if Preferences.getEditor("PreviewMarkdownMermaid"):
+            if MarkdownExtensions.MermaidRegex.search(text):
+                extensions.append(MarkdownExtensions.MermaidExtension())
+                mermaidNeeded = True
         
         if Preferences.getEditor("PreviewMarkdownNLtoBR"):
-            extensions = ['fenced_code', 'nl2br', 'extra']
-        else:
-            extensions = ['fenced_code', 'extra']
+            extensions.append('nl2br')
         
-        # version 2.0 supports only extension names, not instances
-        if (
-            markdown.version_info[0] > 2 or
-            (markdown.version_info[0] == 2 and
-             markdown.version_info[1] > 0)
-        ):
-            class _StrikeThroughExtension(markdown.Extension):
-                """
-                Class is placed here, because it depends on imported markdown,
-                and markdown import is lazy.
+        pyMdown = False
+        if Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions"):
+            try:
+                import pymdownx     # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+                # PyPI package is 'pymdown-extensions'
                 
-                (see http://achinghead.com/
-                python-markdown-adding-insert-delete.html this page for
-                details)
-                """
-                DEL_RE = r'(~~)(.*?)~~'
-
-                def extendMarkdown(self, md, md_globals):
-                    # Create the del pattern
-                    del_tag = markdown.inlinepatterns.SimpleTagPattern(
-                        self.DEL_RE, 'del')
-                    # Insert del pattern into markdown parser
-                    md.inlinePatterns.add('del', del_tag, '>not_strong')
+                extensions.extend([
+                    'toc',
+                    'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
+                    'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
+                    'pymdownx.tasklist', 'pymdownx.smartsymbols',
+                ])
+                pyMdown = True
+            except ImportError:
+                pass
+        
+        if not pyMdown:
+            extensions.extend(['extra', 'toc'])
             
-            extensions.append(_StrikeThroughExtension())
+            # version 2.0 supports only extension names, not instances
+            if (
+                markdown.version_info[0] > 2 or
+                (markdown.version_info[0] == 2 and
+                 markdown.version_info[1] > 0)
+            ):
+                extensions.append(MarkdownExtensions.SimplePatternExtension())
+        
+        if Preferences.getEditor("PreviewMarkdownMathJax"):
+            mathjax = (
+                "<script type='text/javascript' id='MathJax-script' async"
+                " src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/"
+                "tex-chtml.js'>\n"
+                "</script>\n"
+            )
+            # prepare text for mathjax
+            text = (
+                text
+                .replace(r"\(", r"\\(")
+                .replace(r"\)", r"\\)")
+                .replace(r"\[", r"\\[")
+                .replace(r"\]", r"\\]")
+            )
+        else:
+            mathjax = ""
+        
+        if mermaidNeeded:
+            mermaid = (
+                "<script type='text/javascript' id='Mermaid-script'"
+                " src='https://unpkg.com/mermaid@8/dist/mermaid.min.js'>\n"
+                "</script>\n"
+            )
+        else:
+            mermaid = ""
         
         htmlFormat = Preferences.getEditor("PreviewMarkdownHTMLFormat").lower()
-        try:
-            body = markdown.markdown(self.editor.text(),
-                                     extensions=extensions + ['mathjax'],
-                                     output_format=htmlFormat)
-        except (ImportError, ValueError):
-            # markdown raises ValueError or ImportError, depends on version
-            # It is not clear, how to distinguish missing mathjax from other
-            # errors. So keep going without mathjax.
-            body = markdown.markdown(self.editor.text(),
-                                     extensions=extensions,
-                                     output_format=htmlFormat)
+        body = markdown.markdown(text, extensions=extensions,
+                                 output_format=htmlFormat)
         
         if htmlFormat == "xhtml1":
             head = (
@@ -602,8 +625,17 @@
             '''<meta name="Generator" content="eric6" />\n'''
             '''<meta http-equiv="Content-Type" '''
             '''content="text/html; charset=utf-8" />\n'''
+            '''{0}'''
+            '''{1}'''
+            '''<style type="text/css">'''
+            '''{2}'''
+            '''</style>\n'''
             '''</head>\n'''
             '''<body>\n'''
+        ).format(
+            mathjax, mermaid,
+            PreviewerHTMLStyles.css_markdown +
+            PreviewerHTMLStyles.css_pygments
         )
         
         foot = '''\n</body>\n</html>\n'''
--- a/eric6/UI/Previewer.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/UI/Previewer.py	Fri Nov 01 16:11:27 2019 +0100
@@ -10,7 +10,7 @@
 
 import os
 
-from PyQt5.QtCore import QTimer
+from PyQt5.QtCore import pyqtSlot, QTimer
 from PyQt5.QtWidgets import QStackedWidget
 
 import Preferences
@@ -41,7 +41,8 @@
         
         # Don't update too often because the UI might become sluggish
         self.__typingTimer = QTimer()
-        self.__typingTimer.setInterval(500)     # 500ms
+        self.__typingTimer.setInterval(
+            Preferences.getEditor("PreviewRefreshWaitTimer"))   # default 500ms
         self.__typingTimer.timeout.connect(self.__processEditor)
         
         self.__vm.editorChangedEd.connect(self.__editorChanged)
@@ -54,6 +55,14 @@
         
         self.hide()
     
+    @pyqtSlot()
+    def preferencesChanged(self):
+        """
+        Public slot handling a change of preferences.
+        """
+        self.__typingTimer.setInterval(
+            Preferences.getEditor("PreviewRefreshWaitTimer"))
+    
     def show(self):
         """
         Public method to show the preview widget.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/UI/Previewers/MarkdownExtensions.py	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing some Markdown extensions.
+"""
+
+import re
+
+from markdown.extensions import Extension
+from markdown.preprocessors import Preprocessor
+
+from markdown.inlinepatterns import SimpleTagInlineProcessor
+
+######################################################################
+## Code below is an enhanced copy of the Mermaid extension
+##
+## Original code Copyright 2018-2020 [Olivier Ruelle]
+## License: GNU GPLv3
+######################################################################
+
+MermaidRegex = re.compile(
+    r"^(?P<mermaid_sign>[\~\`]){3}[ \t]*[Mm]ermaid[ \t]*$"
+)
+MermaidRegexFullText = re.compile(
+    r"([\~\`]){3}[ \t]*[Mm]ermaid"
+)
+
+
+class MermaidPreprocessor(Preprocessor):
+    """
+    Class implementing a markdown pre-processor for Mermaid.
+    """
+    def run(self, lines):
+        """
+        Public method to do the pre-processing.
+        
+        @param lines text lines to be processed
+        @type list of str
+        @return processed lines
+        @rtype list of str
+        """
+        new_lines = []
+        mermaid_sign = ""
+        m_start = None
+        m_end = None
+        in_mermaid_code = False
+        is_mermaid = False
+        old_line = ""
+        for line in lines:
+            # Wait for starting line with MermaidRegex
+            # (~~~ or ``` following by [mM]ermaid )
+            if not in_mermaid_code:
+                m_start = MermaidRegex.match(line)
+            else:
+                m_end = re.match(r"^[" + mermaid_sign + "]{3}[ \t]*$", line)
+                if m_end:
+                    in_mermaid_code = False
+
+            if m_start:
+                in_mermaid_code = True
+                mermaid_sign = m_start.group("mermaid_sign")
+                if not re.match(r"^[\ \t]*$", old_line):
+                    new_lines.append("")
+                if not is_mermaid:
+                    is_mermaid = True
+                new_lines.append('<div class="mermaid">')
+                m_start = None
+            elif m_end:
+                new_lines.append('</div>')
+                new_lines.append("")
+                m_end = None
+            elif in_mermaid_code:
+                new_lines.append(
+                    line.strip()
+                    .replace("<", "&lt;")
+                    .replace(">", "&gt;")
+                )
+            else:
+
+                new_lines.append(line)
+
+            old_line = line
+
+        if is_mermaid:
+            new_lines.append('')
+            new_lines.append(
+                '<script>mermaid.initialize({startOnLoad:true});</script>'
+            )
+
+        return new_lines
+
+
+class MermaidExtension(Extension):
+    """
+    Class implementing a Markdown Extension for Mermaid.
+    """
+    def extendMarkdown(self, md, md_globals):
+        """
+        Public method to register the extension.
+        
+        @param md reference to markdown
+        @param md_globals global config parameters
+        """
+        md.preprocessors.register(MermaidPreprocessor(md), 'mermaid', 35)
+        md.registerExtension(self)
+
+######################################################################
+## Some extension to some basic additions
+######################################################################
+
+
+class SimplePatternExtension(Extension):
+    """
+    Class implementing a Markdown extension for ~, ~~, ^, ^^ and ==.
+    
+    Note: This is a very simple pattern extension that might conflict with
+    formulas set for MathJax. Use the 'pymdown-extensions' package in this
+    case.
+    """
+    DEL_RE = r'(~~)(.+?)~~'
+    SUB_RE = r'(~)(.+?)~'
+    INS_RE = r'(\^\^)(.*?)\^\^'
+    SUP_RE = r'(\^)(.*?)\^'
+    MARK_RE = r'(==)(.*?)=='
+    
+    def extendMarkdown(self, md):
+        """
+        Public method to register the extension.
+        
+        @param md reference to markdown
+        """
+        md.inlinePatterns.register(
+            SimpleTagInlineProcessor(self.SUB_RE, 'sub'), 'subscript', 30)
+        md.inlinePatterns.register(
+            SimpleTagInlineProcessor(self.DEL_RE, 'del'), 'deleted', 40)
+        md.inlinePatterns.register(
+            SimpleTagInlineProcessor(self.SUP_RE, 'sup'), 'superscript', 30)
+        md.inlinePatterns.register(
+            SimpleTagInlineProcessor(self.INS_RE, 'ins'), 'inserted', 40)
+        md.inlinePatterns.register(
+            SimpleTagInlineProcessor(self.MARK_RE, 'mark'), 'mark', 40)
--- a/eric6/UI/Previewers/PreviewerHTML.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/UI/Previewers/PreviewerHTML.py	Fri Nov 01 16:11:27 2019 +0100
@@ -211,6 +211,8 @@
                     self.ssiCheckBox.isChecked(), rootPath,
                     Preferences.getEditor("PreviewRestUseSphinx"),
                     Preferences.getEditor("PreviewMarkdownNLtoBR"),
+                    Preferences.getEditor(
+                        "PreviewMarkdownUsePyMdownExtensions"),
                     Preferences.getEditor("PreviewMarkdownHTMLFormat"),
                     Preferences.getEditor("PreviewRestDocutilsHTMLFormat"))
 
@@ -338,25 +340,34 @@
         self.__lock = threading.Lock()
     
     def process(self, filePath, language, text, ssiEnabled, rootPath,
-                useSphinx, convertNewLineToBreak, markdownHtmlFormat,
-                restDocutilsHtmlFormat):
+                useSphinx, convertNewLineToBreak, usePyMdownExtensions,
+                markdownHtmlFormat, restDocutilsHtmlFormat):
         """
         Public method to convert the given text to HTML.
         
-        @param filePath file path of the text (string)
-        @param language language of the text (string)
-        @param text text to be processed (string)
+        @param filePath file path of the text
+        @type str
+        @param language language of the text
+        @type str
+        @param text text to be processed
+        @type str
         @param ssiEnabled flag indicating to do some (limited) SSI processing
-            (boolean)
-        @param rootPath root path to be used for SSI processing (str)
+        @type bool
+        @param rootPath root path to be used for SSI processing
+        @type str
         @param useSphinx flag indicating to use Sphinx to generate the
-            ReST preview (boolean)
+            ReST preview
+        @type bool
         @param convertNewLineToBreak flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
+            to HTML break (Markdown only)
+        @type bool
+        @param usePyMdownExtensions flag indicating to enable the PyMdown
+            extensions, if they are available
+        @type bool
         @param markdownHtmlFormat HTML format to be generated by markdown
-            (string)
+        @type str
         @param restDocutilsHtmlFormat HTML format to be generated by docutils
-            (string)
+        @type str
         """
         with self.__lock:
             self.__filePath = filePath
@@ -367,6 +378,7 @@
             self.__haveData = True
             self.__useSphinx = useSphinx
             self.__convertNewLineToBreak = convertNewLineToBreak
+            self.__usePyMdownExtensions = usePyMdownExtensions
             self.__markdownHtmlFormat = markdownHtmlFormat
             self.__restDocutilsHtmlFormat = restDocutilsHtmlFormat
             if not self.isRunning():
@@ -386,6 +398,7 @@
                 rootPath = self.__rootPath
                 useSphinx = self.__useSphinx
                 convertNewLineToBreak = self.__convertNewLineToBreak
+                usePyMdownExtensions = self.__usePyMdownExtensions
                 markdownHtmlFormat = self.__markdownHtmlFormat
                 restDocutilsHtmlFormat = self.__restDocutilsHtmlFormat
             
@@ -393,7 +406,8 @@
 
             html = self.__getHtml(language, text, ssiEnabled, filePath,
                                   rootPath, useSphinx, convertNewLineToBreak,
-                                  markdownHtmlFormat, restDocutilsHtmlFormat)
+                                  usePyMdownExtensions, markdownHtmlFormat,
+                                  restDocutilsHtmlFormat)
             
             with self.__lock:
                 if not self.__haveData:
@@ -402,27 +416,37 @@
                 # else - next iteration
     
     def __getHtml(self, language, text, ssiEnabled, filePath, rootPath,
-                  useSphinx, convertNewLineToBreak, markdownHtmlFormat,
-                  restDocutilsHtmlFormat):
+                  useSphinx, convertNewLineToBreak, usePyMdownExtensions,
+                  markdownHtmlFormat, restDocutilsHtmlFormat):
         """
         Private method to process the given text depending upon the given
         language.
         
-        @param language language of the text (string)
-        @param text to be processed (string)
+        @param language language of the text
+        @type str
+        @param text to be processed
+        @type str
         @param ssiEnabled flag indicating to do some (limited) SSI processing
-            (boolean)
-        @param filePath file path of the text (string)
-        @param rootPath root path to be used for SSI processing (str)
+        @type bool
+        @param filePath file path of the text
+        @type str
+        @param rootPath root path to be used for SSI processing
+        @type str
         @param useSphinx flag indicating to use Sphinx to generate the
-            ReST preview (boolean)
+            ReST preview
+        @type bool
         @param convertNewLineToBreak flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
+            to HTML break (Markdown only)
+        @type bool
+        @param usePyMdownExtensions flag indicating to enable the PyMdown
+            extensions, if they are available
+        @type bool
         @param markdownHtmlFormat HTML format to be generated by markdown
-            (string)
+        @type str
         @param restDocutilsHtmlFormat HTML format to be generated by docutils
-            (string)
-        @return processed HTML text (string)
+        @type str
+        @return processed HTML text
+        @rtype str
         """
         if language == "HTML":
             if ssiEnabled:
@@ -431,8 +455,9 @@
                 html = text
             return self.__processRootPath(html, rootPath)
         elif language == "Markdown":
-            return self.__convertMarkdown(text, convertNewLineToBreak,
-                                          markdownHtmlFormat)
+            return self.__convertMarkdown(
+                text, convertNewLineToBreak, usePyMdownExtensions,
+                markdownHtmlFormat)
         elif language == "ReST":
             return self.__convertReST(text, useSphinx, restDocutilsHtmlFormat)
         else:
@@ -625,15 +650,23 @@
         sys.stderr = origStderr
         return html
     
-    def __convertMarkdown(self, text, convertNewLineToBreak, htmlFormat):
+    def __convertMarkdown(self, text, convertNewLineToBreak,
+                          usePyMdownExtensions, htmlFormat):
         """
         Private method to convert Markdown text into HTML.
         
-        @param text text to be processed (string)
+        @param text text to be processed
+        @type str
         @param convertNewLineToBreak flag indicating to convert new lines
-            to HTML break (Markdown only) (boolean)
-        @param htmlFormat HTML format to be generated by markdown (string)
-        @return processed HTML (string)
+            to HTML break (Markdown only)
+        @type bool
+        @param usePyMdownExtensions flag indicating to enable the PyMdown
+            extensions, if they are available
+        @type bool
+        @param htmlFormat HTML format to be generated by markdown
+        @type str
+        @return processed HTML
+        @rtype str
         """
         try:
             import markdown     # __IGNORE_EXCEPTION__
@@ -645,49 +678,111 @@
                 """<a href="http://pythonhosted.org/Markdown/install.html">"""
                 """installation instructions.</a></p>""")
         
-        try:
-            import mdx_mathjax  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
-        except ImportError:
-            # mathjax doesn't require import statement if installed
-            # as extension
-            pass
+        from . import PreviewerHTMLStyles
+        from . import MarkdownExtensions
+        
+        extensions = []
+        
+        mermaidNeeded = False
+        if Preferences.getEditor("PreviewMarkdownMermaid"):
+            if MarkdownExtensions.MermaidRegexFullText.search(text):
+                extensions.append(MarkdownExtensions.MermaidExtension())
+                mermaidNeeded = True
         
         if convertNewLineToBreak:
-            extensions = ['fenced_code', 'nl2br', 'extra']
-        else:
-            extensions = ['fenced_code', 'extra']
+            extensions.append('nl2br')
         
-        # version 2.0 supports only extension names, not instances
-        if (
-            markdown.version_info[0] > 2 or
-            (markdown.version_info[0] == 2 and
-             markdown.version_info[1] > 0)
-        ):
-            class _StrikeThroughExtension(markdown.Extension):
-                """
-                Class is placed here, because it depends on imported markdown,
-                and markdown import is lazy.
+        pyMdown = False
+        if usePyMdownExtensions:
+            try:
+                import pymdownx     # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+                # PyPI package is 'pymdown-extensions'
                 
-                (see https://pythonhosted.org/Markdown/extensions/api.html
-                this page for details)
-                """
-                DEL_RE = r'(~~)(.*?)~~'
-
-                def extendMarkdown(self, md, md_globals):
-                    # Create the del pattern
-                    del_tag = markdown.inlinepatterns.SimpleTagPattern(
-                        self.DEL_RE, 'del')
-                    # Insert del pattern into markdown parser
-                    md.inlinePatterns.add('del', del_tag, '>not_strong')
+                extensions.extend([
+                    'toc',
+                    'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
+                    'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
+                    'pymdownx.tasklist', 'pymdownx.smartsymbols',
+                ])
+                pyMdown = True
+            except ImportError:
+                pass
+        
+        if not pyMdown:
+            extensions.extend(['extra', 'toc'])
             
-            extensions.append(_StrikeThroughExtension())
+            # version 2.0 supports only extension names, not instances
+            if (
+                markdown.version_info[0] > 2 or
+                (markdown.version_info[0] == 2 and
+                 markdown.version_info[1] > 0)
+            ):
+                extensions.append(MarkdownExtensions.SimplePatternExtension())
 
-        try:
-            return markdown.markdown(text, extensions=extensions + ['mathjax'],
-                                     output_format=htmlFormat.lower())
-        except (ImportError, ValueError):
-            # markdown raises ValueError or ImportError, depends on version
-            # It is not clear, how to distinguish missing mathjax from other
-            # errors. So keep going without mathjax.
-            return markdown.markdown(text, extensions=extensions,
-                                     output_format=htmlFormat.lower())
+        if Preferences.getEditor("PreviewMarkdownMathJax"):
+            mathjax = (
+                "<script type='text/javascript' id='MathJax-script' async"
+                " src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/"
+                "tex-chtml.js'>\n"
+                "</script>\n"
+            )
+            # prepare text for mathjax
+            text = (
+                text
+                .replace(r"\(", r"\\(")
+                .replace(r"\)", r"\\)")
+                .replace(r"\[", r"\\[")
+                .replace(r"\]", r"\\]")
+            )
+        else:
+            mathjax = ""
+        
+        if mermaidNeeded:
+            mermaid = (
+                "<script type='text/javascript' id='Mermaid-script'"
+                " src='https://unpkg.com/mermaid@8/dist/mermaid.min.js'>\n"
+                "</script>\n"
+            )
+        else:
+            mermaid = ""
+        
+        htmlFormat = Preferences.getEditor("PreviewMarkdownHTMLFormat").lower()
+        body = markdown.markdown(text, extensions=extensions,
+                                 output_format=htmlFormat.lower())
+        
+        if htmlFormat == "xhtml1":
+            head = (
+                '''<!DOCTYPE html PUBLIC "-//W3C//DTD'''
+                ''' XHTML 1.0 Transitional//EN"\n'''
+                ''' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional'''
+                '''.dtd">\n'''
+                '''<html xmlns="http://www.w3.org/1999/xhtml">\n'''
+            )
+        elif htmlFormat == "html5":
+            head = (
+                '''<!DOCTYPE html>\n'''
+                '''<html lang="EN">\n'''
+            )
+        else:
+            head = '<html lang="EN">\n'
+        head += '''<head>\n'''
+        head += (
+            '''<meta name="Generator" content="eric6" />\n'''
+            '''<meta http-equiv="Content-Type" '''
+            '''content="text/html; charset=utf-8" />\n'''
+            '''{0}'''
+            '''{1}'''
+            '''<style type="text/css">'''
+            '''{2}'''
+            '''</style>\n'''
+            '''</head>\n'''
+            '''<body>\n'''
+        ).format(
+            mathjax, mermaid,
+            PreviewerHTMLStyles.css_markdown +
+            PreviewerHTMLStyles.css_pygments
+        )
+        
+        foot = '''\n</body>\n</html>\n'''
+        
+        return head + body + foot
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/UI/Previewers/PreviewerHTMLStyles.py	Fri Nov 01 16:11:27 2019 +0100
@@ -0,0 +1,572 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing CSS styles for the Markdown preview.
+"""
+
+
+css_markdown = """
+@media (prefers-color-scheme: light) {
+    :root {
+        --font-color: #000;
+        --background-color: #fff;
+        --alt-backgroundcolor: #f8f8f8;
+        --frame-color: #333;
+    }
+}
+
+@media (prefers-color-scheme: dark) {
+    :root {
+        --font-color: #fff;
+        --background-color: #000;
+        --alt-backgroundcolor: #707070;
+        --frame-color: #ccc;
+    }
+}
+
+html {
+    background-color: var(--background-color, #fff);
+}
+
+body {
+    background-color: var(--background-color, #fff);
+    color: var(--font-color, #000);
+    font-family: sans-serif;
+    font-size:12px;
+    line-height:1.7;
+    word-wrap:break-word
+}
+
+body>*:first-child {
+    margin-top:0 !important
+}
+
+body>*:last-child {
+    margin-bottom:0 !important
+}
+
+a.absent {
+    color:#c00
+}
+
+a.anchor {
+    display:block;
+    padding-right:6px;
+    padding-left:30px;
+    margin-left:-30px;
+    cursor:pointer;
+    position:absolute;
+    top:0;
+    left:0;
+    bottom:0
+}
+
+a.anchor:focus {
+    outline:none
+}
+
+tt, code, pre {
+    font-family: Consolas, "Liberation Mono", Courier, monospace;
+    font-size: 12px;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    margin:1em 0 6px;
+    padding:0;
+    font-weight:bold;
+    line-height:1.7;
+    cursor:text;
+    position:relative
+}
+
+h1 .octicon-link, h2 .octicon-link, h3 .octicon-link, h4 .octicon-link,
+h5 .octicon-link, h6 .octicon-link {
+    display:none;
+    color: var(--font-color, #000);
+}
+
+h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
+h5:hover a.anchor, h6:hover a.anchor {
+    text-decoration:none;
+    line-height:1;
+    padding-left:8px;
+    margin-left:-30px;
+    top:15%
+}
+
+h1:hover a.anchor .octicon-link, h2:hover a.anchor .octicon-link,
+h3:hover a.anchor .octicon-link, h4:hover a.anchor .octicon-link,
+h5:hover a.anchor .octicon-link, h6:hover a.anchor .octicon-link {
+    display:inline-block
+}
+
+h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code,
+h5 tt, h5 code, h6 tt, h6 code {
+    font-size:inherit
+}
+
+h1 {
+    font-size:2em;
+    border-bottom:1px solid #ddd
+}
+
+h2 {
+    font-size:1.6em;
+    border-bottom:1px solid #eee
+}
+
+h3 {
+    font-size:1.4em
+}
+
+h4 {
+    font-size:1.2em
+}
+
+h5 {
+    font-size:1em
+}
+
+h6 {
+    color:#777;
+    font-size:1em
+}
+
+p, blockquote, ul, ol, dl, table, pre {
+    margin:8px 0
+}
+
+hr {
+    background: rgba(216, 216, 216, 1);
+    border: 0 none;
+    color: #ccc;
+    height: 2px;
+    padding: 0;
+    margin: 8px 0;
+}
+
+ul, ol {
+    padding-left:15px
+}
+
+ul.no-list, ul.task-list, ol.no-list, ol.task-list {
+    list-style-type:none;
+}
+
+ul ul, ul ol, ol ol, ol ul {
+    margin-top:0;
+    margin-bottom:0
+}
+
+
+dl {
+    padding:0
+}
+
+dl dt {
+    font-size:14px;
+    font-weight:bold;
+    font-style:italic;
+    padding:0;
+    margin-top:8px
+}
+
+dl dd {
+    margin-bottom:15px;
+    padding:0 8px
+}
+
+blockquote {
+    border-left:4px solid #DDD;
+    padding:0 8px;
+    color:#777
+}
+
+blockquote>:first-child {
+    margin-top:0px
+}
+
+blockquote>:last-child {
+    margin-bottom:0px
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    overflow:auto;
+    display:block
+}
+
+table th {
+    font-weight:bold
+}
+
+table th, table td {
+    border:1px solid #ddd;
+    padding:3px 3px
+}
+
+table tr {
+    border-top:1px solid #ccc;
+    background-color: var(--background-color, #fff);
+}
+
+table tr:nth-child(2n) {
+    background-color:var(--alt-background-color, #f8f8f8);
+}
+
+img {
+    max-width:100%;
+    -moz-box-sizing:border-box;
+    box-sizing:border-box
+}
+
+span.frame {
+    display:block;
+    overflow:hidden
+}
+
+span.frame>span {
+    border:1px solid #ddd;
+    display:block;
+    float:left;
+    overflow:hidden;
+    margin:6px 0 0;
+    padding:7px;
+    width:auto
+}
+
+span.frame span img {
+    display:block;
+    float:left
+}
+
+span.frame span span {
+    clear:both;
+    color:var(--frame-color, #333);
+    display:block;
+    padding:5px 0 0
+}
+
+span.align-center {
+    display:block;
+    overflow:hidden;
+    clear:both
+}
+
+span.align-center>span {
+    display:block;
+    overflow:hidden;
+    margin:6px auto 0;
+    text-align:center
+}
+
+span.align-center span img {
+    margin:0 auto;
+    text-align:center
+}
+
+span.align-right {
+    display:block;
+    overflow:hidden;
+    clear:both
+}
+
+span.align-right>span {
+    display:block;
+    overflow:hidden;
+    margin:6px 0 0;
+    text-align:right
+}
+
+span.align-right span img {
+    margin:0;
+    text-align:right
+}
+
+span.float-left {
+    display:block;
+    margin-right:6px;
+    overflow:hidden;
+    float:left
+}
+
+span.float-left span {
+    margin:6px 0 0
+}
+
+span.float-right {
+    display:block;
+    margin-left:6px;
+    overflow:hidden;
+    float:right
+}
+
+span.float-right>span {
+    display:block;
+    overflow:hidden;
+    margin:6px auto 0;
+    text-align:right
+}
+
+code, tt {
+    margin:0;
+    border:1px solid #ddd;
+    background-color:var(--alt-background-color, #f8f8f8);
+    border-radius:3px;
+    max-width:100%;
+    display:inline-block;
+    overflow:auto;
+    vertical-align:middle;
+    line-height:1.1;
+    padding:0
+}
+
+code:before, code:after, tt:before, tt:after {
+    content:"\00a0"
+}
+
+code {
+    white-space:nowrap
+}
+
+pre>code {
+    margin:0;
+    padding:0;
+    white-space:pre;
+    border:none;
+    background:transparent
+}
+
+.highlight pre, pre {
+    background-color:var(--alt-background-color, #f8f8f8);
+    border:1px solid #ddd;
+    font-size:12px;
+    line-height:16px;
+    overflow:auto;
+    padding:6px 6px;
+    border-radius:3px
+}
+
+pre {
+    word-wrap:normal
+}
+
+pre code, pre tt {
+    margin:0;
+    padding:0;
+    background-color:transparent;
+    border:none;
+    word-wrap:normal;
+    max-width:initial;
+    display:inline;
+    overflow:initial;
+    line-height:inherit
+}
+
+pre code:before, pre code:after, pre tt:before, pre tt:after {
+    content:normal
+}
+
+kbd {
+    border:1px solid gray;
+    font-size:1.2em;
+    box-shadow:1px 0 1px 0 #eee, 0 1px 0 1px #ccc, 0 2px 0 2px #444;
+    -webkit-border-radius:2px;
+    -moz-border-radius:2px;
+    border-radius:2px;
+    margin:2px 3px;
+    padding:1px 5px;
+    color: #000;
+    background-color: #fff
+}
+"""
+
+
+css_pygments = """
+pre .hll { background-color: #ffffcc }
+
+/* Comment */
+pre .c { color: #999988; font-style: italic }
+
+/* Error */
+pre .err { color: #a61717; background-color: #e3d2d2 }
+
+/* Keyword */
+pre .k { font-weight: bold }
+
+/* Operator */
+pre .o { font-weight: bold }
+
+/* Comment.Multiline */
+pre .cm { color: #999988; font-style: italic }
+
+/* Comment.Preproc */
+pre .cp { color: #999999; font-weight: bold; font-style: italic }
+
+/* Comment.Single */
+pre .c1 { color: #999988; font-style: italic }
+
+/* Comment.Special */
+pre .cs { color: #999999; font-weight: bold; font-style: italic }
+
+/* Generic.Deleted */
+pre .gd { color: #000000; background-color: #ffdddd }
+
+/* Generic.Emph */
+pre .ge { font-style: italic }
+
+/* Generic.Error */
+pre .gr { color: #aa0000 }
+
+/* Generic.Heading */
+pre .gh { color: #999999 }
+
+/* Generic.Inserted */
+pre .gi { color: #000000; background-color: #ddffdd }
+
+/* Generic.Output */
+pre .go { color: #888888 }
+
+/* Generic.Prompt */
+pre .gp { color: #555555 }
+
+/* Generic.Strong */
+pre .gs { font-weight: bold }
+
+/* Generic.Subheading */
+pre .gu { color: #aaaaaa }
+
+/* Generic.Traceback */
+pre .gt { color: #aa0000 }
+
+/* Keyword.Constant */
+pre .kc { font-weight: bold }
+
+/* Keyword.Declaration */
+pre .kd { font-weight: bold }
+
+/* Keyword.Namespace */
+pre .kn { font-weight: bold }
+
+/* Keyword.Pseudo */
+pre .kp { font-weight: bold }
+
+/* Keyword.Reserved */
+pre .kr { font-weight: bold }
+
+/* Keyword.Type */
+pre .kt { color: #445588; font-weight: bold }
+
+/* Literal.Number */
+pre .m { color: #009999 }
+
+/* Literal.String */
+pre .s { color: #d01040 }
+
+/* Name.Attribute */
+pre .na { color: #008080 }
+
+/* Name.Builtin */
+pre .nb { color: #0086B3 }
+
+/* Name.Class */
+pre .nc { color: #445588; font-weight: bold }
+
+/* Name.Constant */
+pre .no { color: #008080 }
+
+/* Name.Decorator */
+pre .nd { color: #3c5d5d; font-weight: bold }
+
+/* Name.Entity */
+pre .ni { color: #800080 }
+
+/* Name.Exception */
+pre .ne { color: #990000; font-weight: bold }
+
+/* Name.Function */
+pre .nf { color: #990000; font-weight: bold }
+
+/* Name.Label */
+pre .nl { color: #990000; font-weight: bold }
+
+/* Name.Namespace */
+pre .nn { color: #555555 }
+
+/* Name.Tag */
+pre .nt { color: #000080 }
+
+/* Name.Variable */
+pre .nv { color: #008080 }
+
+/* Operator.Word */
+pre .ow { font-weight: bold }
+
+/* Text.Whitespace */
+pre .w { color: #bbbbbb }
+
+/* Literal.Number.Float */
+pre .mf { color: #009999 }
+
+/* Literal.Number.Hex */
+pre .mh { color: #009999 }
+
+/* Literal.Number.Integer */
+pre .mi { color: #009999 }
+
+/* Literal.Number.Oct */
+pre .mo { color: #009999 }
+
+/* Literal.String.Backtick */
+pre .sb { color: #d01040 }
+
+/* Literal.String.Char */
+pre .sc { color: #d01040 }
+
+/* Literal.String.Doc */
+pre .sd { color: #d01040 }
+
+/* Literal.String.Double */
+pre .s2 { color: #d01040 }
+
+/* Literal.String.Escape */
+pre .se { color: #d01040 }
+
+/* Literal.String.Heredoc */
+pre .sh { color: #d01040 }
+
+/* Literal.String.Interpol */
+pre .si { color: #d01040 }
+
+/* Literal.String.Other */
+pre .sx { color: #d01040 }
+
+/* Literal.String.Regex */
+pre .sr { color: #009926 }
+
+/* Literal.String.Single */
+pre .s1 { color: #d01040 }
+
+/* Literal.String.Symbol */
+pre .ss { color: #990073 }
+
+/* Name.Builtin.Pseudo */
+pre .bp { color: #999999 }
+
+/* Name.Variable.Class */
+pre .vc { color: #008080 }
+
+/* Name.Variable.Global */
+pre .vg { color: #008080 }
+
+/* Name.Variable.Instance */
+pre .vi { color: #008080 }
+
+/* Literal.Number.Integer.Long */
+pre .il { color: #009999 }
+
+"""
--- a/eric6/UI/UserInterface.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/UI/UserInterface.py	Fri Nov 01 16:11:27 2019 +0100
@@ -68,13 +68,16 @@
     appendStderr = pyqtSignal(str)
     appendStdout = pyqtSignal(str)
     
-    def __init__(self, stderr):
+    def __init__(self, stderr, parent=None):
         """
         Constructor
         
         @param stderr flag indicating stderr is being redirected
-        """
-        super(Redirector, self).__init__()
+        @type bool
+        @param parent reference to the parent object
+        @type QObject
+        """
+        super(Redirector, self).__init__(parent)
         self.stderr = stderr
         self.buffer = ''
         
@@ -300,8 +303,8 @@
         self.shell.setDebuggerUI(self.debuggerUI)
         
         # Generate the redirection helpers
-        self.stdout = Redirector(False)
-        self.stderr = Redirector(True)
+        self.stdout = Redirector(False, self)
+        self.stderr = Redirector(True, self)
         
         # set a few dialog members for non-modal dialogs created on demand
         self.programsDialog = None
@@ -482,6 +485,7 @@
         self.preferencesChanged.connect(self.debugViewer.preferencesChanged)
         self.preferencesChanged.connect(
             self.backgroundService.preferencesOrProjectChanged)
+        self.preferencesChanged.connect(self.__previewer.preferencesChanged)
         
         if self.browser is not None:
             self.browser.sourceFile[str].connect(
--- a/eric6/WebBrowser/Network/NetworkManager.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/WebBrowser/Network/NetworkManager.py	Fri Nov 01 16:11:27 2019 +0100
@@ -29,7 +29,6 @@
 from .NetworkUrlInterceptor import NetworkUrlInterceptor
 from ..Tools.WebBrowserTools import readAllFileContents, pixmapToDataUrl
 
-from Globals import qVersionTuple
 from Utilities.AutoSaver import AutoSaver
 import Preferences
 
@@ -79,25 +78,12 @@
         self.authenticationRequired.connect(
             lambda reply, auth: self.authentication(reply.url(), auth))
         
-        if qVersionTuple() >= (5, 12, 0):
-            from PyQt5.QtWebEngineCore import QWebEngineUrlScheme
-            scheme = QWebEngineUrlScheme(b"eric")
-            scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
-            scheme.setFlags(QWebEngineUrlScheme.SecureScheme |
-                            QWebEngineUrlScheme.ContentSecurityPolicyIgnored)
-            QWebEngineUrlScheme.registerScheme(scheme)
         from .EricSchemeHandler import EricSchemeHandler
         self.__ericSchemeHandler = EricSchemeHandler()
         WebBrowserWindow.webProfile().installUrlSchemeHandler(
             QByteArray(b"eric"), self.__ericSchemeHandler)
         
         if engine:
-            if qVersionTuple() >= (5, 12, 0):
-                from PyQt5.QtWebEngineCore import QWebEngineUrlScheme
-                scheme = QWebEngineUrlScheme(b"qthelp")
-                scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
-                scheme.setFlags(QWebEngineUrlScheme.SecureScheme)
-                QWebEngineUrlScheme.registerScheme(scheme)
             from .QtHelpSchemeHandler import QtHelpSchemeHandler
             self.__qtHelpSchemeHandler = QtHelpSchemeHandler(engine)
             WebBrowserWindow.webProfile().installUrlSchemeHandler(
--- a/eric6/eric6.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/eric6.py	Fri Nov 01 16:11:27 2019 +0100
@@ -26,18 +26,13 @@
 sys.path.insert(1, os.path.dirname(__file__))
 
 try:
-    from PyQt5.QtCore import pyqt5_enable_new_onexit_scheme
-    # __IGNORE_EXCEPTION__
-    pyqt5_enable_new_onexit_scheme(True)
-except ImportError:
     try:
-        try:
-            from PyQt5 import sip       # __IGNORE_EXCEPTION__
-        except ImportError:
-            import sip
-        sip.setdestroyonexit(False)
-    except AttributeError:
-        pass
+        from PyQt5 import sip       # __IGNORE_EXCEPTION__
+    except ImportError:
+        import sip
+    sip.setdestroyonexit(False)
+except AttributeError:
+    pass
 
 import traceback
 import time
--- a/eric6/eric6_browser.py	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/eric6_browser.py	Fri Nov 01 16:11:27 2019 +0100
@@ -20,7 +20,7 @@
 
 try:
     try:
-        from PyQt5 import sip
+        from PyQt5 import sip       # __IGNORE_EXCEPTION__
     except ImportError:
         import sip
     sip.setdestroyonexit(False)
@@ -68,7 +68,7 @@
     sys.exit(100)
 
 import Globals
-from Globals import AppInfo
+from Globals import AppInfo, qVersionTuple
 
 from E5Gui.E5Application import E5Application
 
@@ -159,6 +159,20 @@
     # set the library paths for plugins
     Startup.setLibraryPaths()
     
+    if qVersionTuple() >= (5, 12, 0):
+        from PyQt5.QtWebEngineCore import QWebEngineUrlScheme
+        scheme = QWebEngineUrlScheme(b"eric")
+        scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
+        scheme.setFlags(QWebEngineUrlScheme.SecureScheme |
+                        QWebEngineUrlScheme.ContentSecurityPolicyIgnored)
+        QWebEngineUrlScheme.registerScheme(scheme)
+    if "--qthelp" in sys.argv and qVersionTuple() >= (5, 12, 0):
+        from PyQt5.QtWebEngineCore import QWebEngineUrlScheme
+        scheme = QWebEngineUrlScheme(b"qthelp")
+        scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
+        scheme.setFlags(QWebEngineUrlScheme.SecureScheme)
+        QWebEngineUrlScheme.registerScheme(scheme)
+    
     app = E5Application(sys.argv)
     if "--private" not in sys.argv:
         client = WebBrowserSingleApplicationClient()
--- a/eric6/i18n/eric6_cs.ts	Thu Oct 03 11:12:50 2019 +0200
+++ b/eric6/i18n/eric6_cs.ts	Fri Nov 01 16:11:27 2019 +0100
@@ -1393,17 +1393,17 @@
         <translation>Ověřit protokol chyb při spuštění</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="246"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="270"/>
         <source>Keyboard Input Interval</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="252"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="276"/>
         <source>Enter the keyboard input interval, &apos;0&apos; for default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="261"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="285"/>
         <source> ms</source>
         <translation type="unfinished"> ms</translation>
     </message>
@@ -1428,22 +1428,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="258"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="282"/>
         <source>System Default</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="290"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="314"/>
         <source>Background Services</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="308"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="332"/>
         <source>max. Processes:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="318"/>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="342"/>
         <source>Automatic</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1462,6 +1462,36 @@
         <source>Use Global Menu Bar</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="245"/>
+        <source>Minimum Severity for message dialog:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.ui" line="258"/>
+        <source>Select the minimum message severity shown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.py" line="38"/>
+        <source>Debug</source>
+        <translation type="unfinished">Debug</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.py" line="39"/>
+        <source>Warning</source>
+        <translation type="unfinished">Varování</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.py" line="40"/>
+        <source>Critical</source>
+        <translation type="unfinished">Kritický</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/ApplicationPage.py" line="41"/>
+        <source>Fatal Error</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>AuthenticationDialog</name>
@@ -10938,925 +10968,930 @@
 <context>
     <name>Editor</name>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2999"/>
+        <location filename="../QScintilla/Editor.py" line="3105"/>
         <source>Open File</source>
         <translation>Otevřít soubor</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="751"/>
-        <source>Undo</source>
-        <translation>Vrátit</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="754"/>
-        <source>Redo</source>
-        <translation>Znovu použít</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="757"/>
-        <source>Revert to last saved state</source>
-        <translation>Vrátit k poslednímu uloženému stavu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="761"/>
-        <source>Cut</source>
-        <translation>Vyjmout</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="764"/>
-        <source>Copy</source>
-        <translation>Kopírovat</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="767"/>
-        <source>Paste</source>
-        <translation>Vložit</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="775"/>
-        <source>Indent</source>
-        <translation>Odsadit</translation>
-    </message>
-    <message>
         <location filename="../QScintilla/Editor.py" line="778"/>
-        <source>Unindent</source>
-        <translation>Zrušit odsazení</translation>
+        <source>Undo</source>
+        <translation>Vrátit</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="781"/>
-        <source>Comment</source>
-        <translation>Vytvořit komentář</translation>
+        <source>Redo</source>
+        <translation>Znovu použít</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="784"/>
-        <source>Uncomment</source>
-        <translation>Zrušit komentář</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="787"/>
-        <source>Stream Comment</source>
-        <translation>Proudový komentář</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="790"/>
-        <source>Box Comment</source>
-        <translation>Obdélníkový komentář</translation>
+        <source>Revert to last saved state</source>
+        <translation>Vrátit k poslednímu uloženému stavu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="788"/>
+        <source>Cut</source>
+        <translation>Vyjmout</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="791"/>
+        <source>Copy</source>
+        <translation>Kopírovat</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="794"/>
+        <source>Paste</source>
+        <translation>Vložit</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="802"/>
+        <source>Indent</source>
+        <translation>Odsadit</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="805"/>
+        <source>Unindent</source>
+        <translation>Zrušit odsazení</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="808"/>
+        <source>Comment</source>
+        <translation>Vytvořit komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="811"/>
+        <source>Uncomment</source>
+        <translation>Zrušit komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="814"/>
+        <source>Stream Comment</source>
+        <translation>Proudový komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="817"/>
+        <source>Box Comment</source>
+        <translation>Obdélníkový komentář</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="821"/>
         <source>Select to brace</source>
         <translation>Vybrat až po závorku</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="796"/>
+        <location filename="../QScintilla/Editor.py" line="823"/>
         <source>Select all</source>
         <translation>Vybrat vše</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="797"/>
+        <location filename="../QScintilla/Editor.py" line="824"/>
         <source>Deselect all</source>
         <translation>Zrušit celý výběr</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="813"/>
+        <location filename="../QScintilla/Editor.py" line="842"/>
         <source>Shorten empty lines</source>
         <translation>Zkrátit prázdné řádky</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="820"/>
+        <location filename="../QScintilla/Editor.py" line="849"/>
         <source>Use Monospaced Font</source>
         <translation>Použít neporoporcionální font</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="825"/>
+        <location filename="../QScintilla/Editor.py" line="854"/>
         <source>Autosave enabled</source>
         <translation>Zapnout autosave</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="868"/>
+        <location filename="../QScintilla/Editor.py" line="897"/>
         <source>Close</source>
         <translation>Zavřít</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="874"/>
+        <location filename="../QScintilla/Editor.py" line="903"/>
         <source>Save</source>
         <translation>Uložit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="877"/>
+        <location filename="../QScintilla/Editor.py" line="906"/>
         <source>Save As...</source>
         <translation>Uložit jako...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="893"/>
-        <source>Print</source>
-        <translation>Tisk</translation>
-    </message>
-    <message>
         <location filename="../QScintilla/Editor.py" line="922"/>
+        <source>Print</source>
+        <translation>Tisk</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="951"/>
         <source>Complete from Document</source>
         <translation type="unfinished">z dokumentu</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="924"/>
+        <location filename="../QScintilla/Editor.py" line="953"/>
         <source>Complete from APIs</source>
         <translation type="unfinished">z API</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="926"/>
+        <location filename="../QScintilla/Editor.py" line="955"/>
         <source>Complete from Document and APIs</source>
         <translation type="unfinished">z dokumentu a API</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="940"/>
+        <location filename="../QScintilla/Editor.py" line="969"/>
         <source>Check</source>
         <translation>Zkontrolovat</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="960"/>
+        <location filename="../QScintilla/Editor.py" line="989"/>
         <source>Show</source>
         <translation>Zobrazit</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="962"/>
+        <location filename="../QScintilla/Editor.py" line="991"/>
         <source>Code metrics...</source>
         <translation>Metrika kódu...</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="963"/>
-        <source>Code coverage...</source>
-        <translation>Pokrytí kódu...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="965"/>
-        <source>Show code coverage annotations</source>
-        <translation>Zobrazit poznámky pokrytí kódu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="968"/>
-        <source>Hide code coverage annotations</source>
-        <translation>Skrýt poznámky pokrytí kódu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="971"/>
-        <source>Profile data...</source>
-        <translation>Profilovat data...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="984"/>
-        <source>Diagrams</source>
-        <translation>Diagramy</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="986"/>
-        <source>Class Diagram...</source>
-        <translation>Diagram třídy...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="988"/>
-        <source>Package Diagram...</source>
-        <translation>Diagram balíčku...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="990"/>
-        <source>Imports Diagram...</source>
-        <translation>Diagram importů...</translation>
-    </message>
-    <message>
         <location filename="../QScintilla/Editor.py" line="992"/>
-        <source>Application Diagram...</source>
-        <translation>Diagram aplikace...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1010"/>
-        <source>Languages</source>
-        <translation>Jazyky</translation>
+        <source>Code coverage...</source>
+        <translation>Pokrytí kódu...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="994"/>
+        <source>Show code coverage annotations</source>
+        <translation>Zobrazit poznámky pokrytí kódu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="997"/>
+        <source>Hide code coverage annotations</source>
+        <translation>Skrýt poznámky pokrytí kódu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1000"/>
+        <source>Profile data...</source>
+        <translation>Profilovat data...</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="1013"/>
-        <source>No Language</source>
-        <translation>Žádný jazyk</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1158"/>
-        <source>Toggle bookmark</source>
-        <translation>Přepnout záložku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1160"/>
-        <source>Next bookmark</source>
-        <translation>Následující záložka</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1162"/>
-        <source>Previous bookmark</source>
-        <translation>Předchozí záložka</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1164"/>
-        <source>Clear all bookmarks</source>
-        <translation>Zrušit všechny záložky</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1238"/>
-        <source>Goto syntax error</source>
-        <translation>Jít na chybu syntaxe</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1242"/>
-        <source>Show syntax error message</source>
-        <translation>Zobrazit hlášení syntaktické chyby</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1247"/>
-        <source>Clear syntax error</source>
-        <translation>Zrušit chybu syntaxe</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1173"/>
-        <source>Toggle breakpoint</source>
-        <translation>Přepnout breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1175"/>
-        <source>Toggle temporary breakpoint</source>
-        <translation>Přepnout dočasný breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1178"/>
-        <source>Edit breakpoint...</source>
-        <translation>Editovat breakpoint...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5500"/>
-        <source>Enable breakpoint</source>
-        <translation>Aktivovat breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1183"/>
-        <source>Next breakpoint</source>
-        <translation>Následující breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1185"/>
-        <source>Previous breakpoint</source>
-        <translation>Předchozí breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1190"/>
-        <source>Clear all breakpoints</source>
-        <translation>Zrušit všechny breakpointy</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1269"/>
-        <source>Next uncovered line</source>
-        <translation>Následující odkrytá řádka</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1273"/>
-        <source>Previous uncovered line</source>
-        <translation>Předchozí odkrytá řádka</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1278"/>
-        <source>Next task</source>
-        <translation>Následující úloha</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1282"/>
-        <source>Previous task</source>
-        <translation>Předchozí úloha</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1848"/>
-        <source>Modification of Read Only file</source>
-        <translation>Modifikace souboru otevřeného jen pro čtení</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1848"/>
-        <source>You are attempting to change a read only file. Please save to a different file first.</source>
-        <translation>Pokoušíte se změnit soubor, který je otevřen jen pro čtení. Prosím, uložte jej nejdříve do jiného souboru.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="2556"/>
-        <source>Printing...</source>
-        <translation>Tisk...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="2573"/>
-        <source>Printing completed</source>
-        <translation>Tisk je hotov</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="2575"/>
-        <source>Error while printing</source>
-        <translation>Chyba během tisku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="2578"/>
-        <source>Printing aborted</source>
-        <translation>Tisk byl zrušen</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="3188"/>
-        <source>Save File</source>
-        <translation>Uložit soubor</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="2939"/>
-        <source>File Modified</source>
-        <translation>Soubor je modifikován</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4665"/>
-        <source>Autocompletion</source>
-        <translation>Autodoplňování</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4665"/>
-        <source>Autocompletion is not available because there is no autocompletion source set.</source>
-        <translation>Autodoplňování není dostupné protože zdrojová část autodoplňování nebyla nalezena.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5503"/>
-        <source>Disable breakpoint</source>
-        <translation>Deaktivovat breakpoint</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5878"/>
-        <source>Code Coverage</source>
-        <translation>Pokrytí kódu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5878"/>
-        <source>Please select a coverage file</source>
-        <translation>Prosím, vyberte soubor s pokrytím kódu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5941"/>
-        <source>Show Code Coverage Annotations</source>
-        <translation>Zobrazit poznámky pokrytí kódu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5934"/>
-        <source>All lines have been covered.</source>
-        <translation>Všechny řádky byly pokryty.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5941"/>
-        <source>There is no coverage file available.</source>
-        <translation>Soubor s pokrytím není dostupný.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6058"/>
-        <source>Profile Data</source>
-        <translation>Profilovat data</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6058"/>
-        <source>Please select a profile file</source>
-        <translation>Prosím, vyberte soubor s profilem</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6220"/>
-        <source>Syntax Error</source>
-        <translation>Chyba syntaxe</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6220"/>
-        <source>No syntax error message available.</source>
-        <translation>Hlášení syntaktické chyby není dostupné.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6611"/>
-        <source>Macro Name</source>
-        <translation>Název makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6611"/>
-        <source>Select a macro name:</source>
-        <translation>Vyberte název makra:</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6639"/>
-        <source>Load macro file</source>
-        <translation>Načíst soubor makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6682"/>
-        <source>Macro files (*.macro)</source>
-        <translation>Macro soubory (*.macro)</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6662"/>
-        <source>Error loading macro</source>
-        <translation>Chyba při načítání makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6682"/>
-        <source>Save macro file</source>
-        <translation>Uložit soubor s makrem</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6699"/>
-        <source>Save macro</source>
-        <translation>Uložit makro</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6715"/>
-        <source>Error saving macro</source>
-        <translation>Chyba při ukládání makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6728"/>
-        <source>Start Macro Recording</source>
-        <translation>Spustit záznam makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6728"/>
-        <source>Macro recording is already active. Start new?</source>
-        <translation>Nahrávání makra již probíhá. Spustit nové?</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6754"/>
-        <source>Macro Recording</source>
-        <translation>Záznam makra</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6754"/>
-        <source>Enter name of the macro:</source>
-        <translation>Vložte název makra:</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6894"/>
-        <source>File changed</source>
-        <translation>Soubor změněn</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7200"/>
-        <source>Drop Error</source>
-        <translation>Zahodit chybu</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7221"/>
-        <source>Resources</source>
-        <translation>Zdroje</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7223"/>
-        <source>Add file...</source>
-        <translation>Přidat soubor...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7225"/>
-        <source>Add files...</source>
-        <translation>Přidat soubory...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7227"/>
-        <source>Add aliased file...</source>
-        <translation>Přidat zástupce souboru...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7230"/>
-        <source>Add localized resource...</source>
-        <translation>Přidat lokalizované resource...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7234"/>
-        <source>Add resource frame</source>
-        <translation>Přidat resource frame</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7253"/>
-        <source>Add file resource</source>
-        <translation>Přidat soubor resource</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7269"/>
-        <source>Add file resources</source>
-        <translation>Přidat soubory resource</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7296"/>
-        <source>Add aliased file resource</source>
-        <translation>Přidat zástupce souboru resource</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7362"/>
-        <source>Package Diagram</source>
-        <translation>Diagram balíčku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7362"/>
-        <source>Include class attributes?</source>
-        <translation>Včetně atributů třídy?</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7398"/>
-        <source>Application Diagram</source>
-        <translation>Diagram aplikace</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7398"/>
-        <source>Include module names?</source>
-        <translation>Včetně jmen modulů?</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1136"/>
-        <source>Export as</source>
-        <translation>Exportovat jako</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1332"/>
-        <source>Export source</source>
-        <translation>Export zdroj</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1332"/>
-        <source>No export format given. Aborting...</source>
-        <translation>Nebyl zadán forám exportu. Zrušeno....</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7384"/>
-        <source>Imports Diagram</source>
-        <translation>Importovat diagram</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7384"/>
-        <source>Include imports from external modules?</source>
-        <translation>Zahrnout importy z externích modulů?</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="844"/>
-        <source>Calltip</source>
-        <translation>Rychlé tipy</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="890"/>
-        <source>Print Preview</source>
-        <translation>Náhled tisku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="449"/>
-        <source>&lt;b&gt;A Source Editor Window&lt;/b&gt;&lt;p&gt;This window is used to display and edit a source file.  You can open as many of these as you like. The name of the file is displayed in the window&apos;s titlebar.&lt;/p&gt;&lt;p&gt;In order to set breakpoints just click in the space between the line numbers and the fold markers. Via the context menu of the margins they may be edited.&lt;/p&gt;&lt;p&gt;In order to set bookmarks just Shift click in the space between the line numbers and the fold markers.&lt;/p&gt;&lt;p&gt;These actions can be reversed via the context menu.&lt;/p&gt;&lt;p&gt;Ctrl clicking on a syntax error marker shows some info about this error.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Okno editoru zdrojového kódu&lt;/b&gt;&lt;p&gt;V tomto okně se zobrazuje a edituje soubor se zdrojovým kódem. Můžete otevřít oken podle libosti. Jméno souboru se zobrazuje v titlebaru okna.&lt;/p&gt;&lt;p&gt;Kliknutím do prostoru mezi čísly řádku a značkami skládání nastavíte breakpoint. Přes kontextové menu je pak lze editovat.&lt;/p&gt;&lt;p&gt;Záložka se vkládá kliknutím na stejné místo se stisknutou klávesou Shift.&lt;/p&gt;&lt;p&gt;Tyto akce mohou být navráceny zpět i opětovným kliknutím nebo přes kontextové menu.&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="829"/>
-        <source>Typing aids enabled</source>
-        <translation>Pomůcky při psaní zapnuty</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1100"/>
-        <source>End-of-Line Type</source>
-        <translation>Typ Konec-řádku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1104"/>
-        <source>Unix</source>
-        <translation>Unix</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1111"/>
-        <source>Windows</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1118"/>
-        <source>Macintosh</source>
-        <translation>Macintosh</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1059"/>
-        <source>Encodings</source>
-        <translation>Kódování</translation>
+        <source>Diagrams</source>
+        <translation>Diagramy</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1015"/>
+        <source>Class Diagram...</source>
+        <translation>Diagram třídy...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1017"/>
+        <source>Package Diagram...</source>
+        <translation>Diagram balíčku...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1019"/>
+        <source>Imports Diagram...</source>
+        <translation>Diagram importů...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1021"/>
+        <source>Application Diagram...</source>
+        <translation>Diagram aplikace...</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="1039"/>
-        <source>Guessed</source>
-        <translation>Odhadem</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1347"/>
-        <source>Alternatives</source>
-        <translation>Alternativy</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1363"/>
-        <source>Pygments Lexer</source>
-        <translation></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1363"/>
-        <source>Select the Pygments lexer to apply.</source>
-        <translation>Použít Pygments lexer.</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7697"/>
-        <source>Check spelling...</source>
-        <translation>Zatrhnout kontrolu...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="805"/>
-        <source>Check spelling of selection...</source>
-        <translation>Zatrhnout výběr kontroly...</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7700"/>
-        <source>Add to dictionary</source>
-        <translation>Přidat do slovníku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="7702"/>
-        <source>Ignore All</source>
-        <translation>Ignorovat vše</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="809"/>
-        <source>Remove from dictionary</source>
-        <translation>Odebrat ze slovníku</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="360"/>
-        <source>&lt;p&gt;The size of the file &lt;b&gt;{0}&lt;/b&gt; is &lt;b&gt;{1} KB&lt;/b&gt;. Do you really want to load it?&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Velikost souboru &lt;b&gt;{0}&lt;/b&gt; je &lt;b&gt;{1} KB&lt;/b&gt;. Opravdu jej chcete načíst?&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1324"/>
-        <source>&lt;p&gt;No exporter available for the export format &lt;b&gt;{0}&lt;/b&gt;. Aborting...&lt;/p&gt;</source>
-        <translation>&lt;p&gt;Pro formát exportu &lt;b&gt;{0}&lt;/b&gt; není exportér dostupný. Zrušeno.&lt;/p&gt;</translation>
+        <source>Languages</source>
+        <translation>Jazyky</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1172"/>
+        <source>No Language</source>
+        <translation>Žádný jazyk</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1219"/>
+        <source>Toggle bookmark</source>
+        <translation>Přepnout záložku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1221"/>
+        <source>Next bookmark</source>
+        <translation>Následující záložka</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1223"/>
+        <source>Previous bookmark</source>
+        <translation>Předchozí záložka</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1225"/>
+        <source>Clear all bookmarks</source>
+        <translation>Zrušit všechny záložky</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1299"/>
+        <source>Goto syntax error</source>
+        <translation>Jít na chybu syntaxe</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1303"/>
+        <source>Show syntax error message</source>
+        <translation>Zobrazit hlášení syntaktické chyby</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1308"/>
+        <source>Clear syntax error</source>
+        <translation>Zrušit chybu syntaxe</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1234"/>
+        <source>Toggle breakpoint</source>
+        <translation>Přepnout breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1236"/>
+        <source>Toggle temporary breakpoint</source>
+        <translation>Přepnout dočasný breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1239"/>
+        <source>Edit breakpoint...</source>
+        <translation>Editovat breakpoint...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5606"/>
+        <source>Enable breakpoint</source>
+        <translation>Aktivovat breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1244"/>
+        <source>Next breakpoint</source>
+        <translation>Následující breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1246"/>
+        <source>Previous breakpoint</source>
+        <translation>Předchozí breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1251"/>
+        <source>Clear all breakpoints</source>
+        <translation>Zrušit všechny breakpointy</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1330"/>
+        <source>Next uncovered line</source>
+        <translation>Následující odkrytá řádka</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1334"/>
+        <source>Previous uncovered line</source>
+        <translation>Předchozí odkrytá řádka</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1339"/>
+        <source>Next task</source>
+        <translation>Následující úloha</translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="1343"/>
+        <source>Previous task</source>
+        <translation>Předchozí úloha</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1954"/>
+        <source>Modification of Read Only file</source>
+        <translation>Modifikace souboru otevřeného jen pro čtení</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1954"/>
+        <source>You are attempting to change a read only file. Please save to a different file first.</source>
+        <translation>Pokoušíte se změnit soubor, který je otevřen jen pro čtení. Prosím, uložte jej nejdříve do jiného souboru.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="2662"/>
+        <source>Printing...</source>
+        <translation>Tisk...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="2679"/>
+        <source>Printing completed</source>
+        <translation>Tisk je hotov</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="2681"/>
+        <source>Error while printing</source>
+        <translation>Chyba během tisku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="2684"/>
+        <source>Printing aborted</source>
+        <translation>Tisk byl zrušen</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="3294"/>
+        <source>Save File</source>
+        <translation>Uložit soubor</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="3045"/>
+        <source>File Modified</source>
+        <translation>Soubor je modifikován</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4771"/>
+        <source>Autocompletion</source>
+        <translation>Autodoplňování</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4771"/>
+        <source>Autocompletion is not available because there is no autocompletion source set.</source>
+        <translation>Autodoplňování není dostupné protože zdrojová část autodoplňování nebyla nalezena.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5609"/>
+        <source>Disable breakpoint</source>
+        <translation>Deaktivovat breakpoint</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5984"/>
+        <source>Code Coverage</source>
+        <translation>Pokrytí kódu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5984"/>
+        <source>Please select a coverage file</source>
+        <translation>Prosím, vyberte soubor s pokrytím kódu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6047"/>
+        <source>Show Code Coverage Annotations</source>
+        <translation>Zobrazit poznámky pokrytí kódu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6040"/>
+        <source>All lines have been covered.</source>
+        <translation>Všechny řádky byly pokryty.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6047"/>
+        <source>There is no coverage file available.</source>
+        <translation>Soubor s pokrytím není dostupný.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6164"/>
+        <source>Profile Data</source>
+        <translation>Profilovat data</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6164"/>
+        <source>Please select a profile file</source>
+        <translation>Prosím, vyberte soubor s profilem</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6326"/>
+        <source>Syntax Error</source>
+        <translation>Chyba syntaxe</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6326"/>
+        <source>No syntax error message available.</source>
+        <translation>Hlášení syntaktické chyby není dostupné.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6717"/>
+        <source>Macro Name</source>
+        <translation>Název makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6717"/>
+        <source>Select a macro name:</source>
+        <translation>Vyberte název makra:</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6745"/>
+        <source>Load macro file</source>
+        <translation>Načíst soubor makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6788"/>
+        <source>Macro files (*.macro)</source>
+        <translation>Macro soubory (*.macro)</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6768"/>
+        <source>Error loading macro</source>
+        <translation>Chyba při načítání makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6788"/>
+        <source>Save macro file</source>
+        <translation>Uložit soubor s makrem</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6805"/>
+        <source>Save macro</source>
+        <translation>Uložit makro</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6821"/>
+        <source>Error saving macro</source>
+        <translation>Chyba při ukládání makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6834"/>
+        <source>Start Macro Recording</source>
+        <translation>Spustit záznam makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6834"/>
+        <source>Macro recording is already active. Start new?</source>
+        <translation>Nahrávání makra již probíhá. Spustit nové?</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6860"/>
+        <source>Macro Recording</source>
+        <translation>Záznam makra</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6860"/>
+        <source>Enter name of the macro:</source>
+        <translation>Vložte název makra:</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7000"/>
+        <source>File changed</source>
+        <translation>Soubor změněn</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7306"/>
+        <source>Drop Error</source>
+        <translation>Zahodit chybu</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7327"/>
+        <source>Resources</source>
+        <translation>Zdroje</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7329"/>
+        <source>Add file...</source>
+        <translation>Přidat soubor...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7331"/>
+        <source>Add files...</source>
+        <translation>Přidat soubory...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7333"/>
+        <source>Add aliased file...</source>
+        <translation>Přidat zástupce souboru...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7336"/>
+        <source>Add localized resource...</source>
+        <translation>Přidat lokalizované resource...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7340"/>
+        <source>Add resource frame</source>
+        <translation>Přidat resource frame</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7359"/>
+        <source>Add file resource</source>
+        <translation>Přidat soubor resource</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7375"/>
+        <source>Add file resources</source>
+        <translation>Přidat soubory resource</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7402"/>
+        <source>Add aliased file resource</source>
+        <translation>Přidat zástupce souboru resource</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7468"/>
+        <source>Package Diagram</source>
+        <translation>Diagram balíčku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7468"/>
+        <source>Include class attributes?</source>
+        <translation>Včetně atributů třídy?</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7504"/>
+        <source>Application Diagram</source>
+        <translation>Diagram aplikace</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7504"/>
+        <source>Include module names?</source>
+        <translation>Včetně jmen modulů?</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1197"/>
+        <source>Export as</source>
+        <translation>Exportovat jako</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1393"/>
+        <source>Export source</source>
+        <translation>Export zdroj</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1393"/>
+        <source>No export format given. Aborting...</source>
+        <translation>Nebyl zadán forám exportu. Zrušeno....</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7490"/>
+        <source>Imports Diagram</source>
+        <translation>Importovat diagram</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7490"/>
+        <source>Include imports from external modules?</source>
+        <translation>Zahrnout importy z externích modulů?</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="873"/>
+        <source>Calltip</source>
+        <translation>Rychlé tipy</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="919"/>
+        <source>Print Preview</source>
+        <translation>Náhled tisku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="453"/>
+        <source>&lt;b&gt;A Source Editor Window&lt;/b&gt;&lt;p&gt;This window is used to display and edit a source file.  You can open as many of these as you like. The name of the file is displayed in the window&apos;s titlebar.&lt;/p&gt;&lt;p&gt;In order to set breakpoints just click in the space between the line numbers and the fold markers. Via the context menu of the margins they may be edited.&lt;/p&gt;&lt;p&gt;In order to set bookmarks just Shift click in the space between the line numbers and the fold markers.&lt;/p&gt;&lt;p&gt;These actions can be reversed via the context menu.&lt;/p&gt;&lt;p&gt;Ctrl clicking on a syntax error marker shows some info about this error.&lt;/p&gt;</source>
+        <translation>&lt;b&gt;Okno editoru zdrojového kódu&lt;/b&gt;&lt;p&gt;V tomto okně se zobrazuje a edituje soubor se zdrojovým kódem. Můžete otevřít oken podle libosti. Jméno souboru se zobrazuje v titlebaru okna.&lt;/p&gt;&lt;p&gt;Kliknutím do prostoru mezi čísly řádku a značkami skládání nastavíte breakpoint. Přes kontextové menu je pak lze editovat.&lt;/p&gt;&lt;p&gt;Záložka se vkládá kliknutím na stejné místo se stisknutou klávesou Shift.&lt;/p&gt;&lt;p&gt;Tyto akce mohou být navráceny zpět i opětovným kliknutím nebo přes kontextové menu.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="858"/>
+        <source>Typing aids enabled</source>
+        <translation>Pomůcky při psaní zapnuty</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1129"/>
+        <source>End-of-Line Type</source>
+        <translation>Typ Konec-řádku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1133"/>
+        <source>Unix</source>
+        <translation>Unix</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1140"/>
+        <source>Windows</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1147"/>
+        <source>Macintosh</source>
+        <translation>Macintosh</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1088"/>
+        <source>Encodings</source>
+        <translation>Kódování</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1068"/>
+        <source>Guessed</source>
+        <translation>Odhadem</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1408"/>
+        <source>Alternatives</source>
+        <translation>Alternativy</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1424"/>
+        <source>Pygments Lexer</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1424"/>
+        <source>Select the Pygments lexer to apply.</source>
+        <translation>Použít Pygments lexer.</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7833"/>
+        <source>Check spelling...</source>
+        <translation>Zatrhnout kontrolu...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="832"/>
+        <source>Check spelling of selection...</source>
+        <translation>Zatrhnout výběr kontroly...</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7836"/>
+        <source>Add to dictionary</source>
+        <translation>Přidat do slovníku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="7838"/>
+        <source>Ignore All</source>
+        <translation>Ignorovat vše</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="836"/>
+        <source>Remove from dictionary</source>
+        <translation>Odebrat ze slovníku</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="364"/>
+        <source>&lt;p&gt;The size of the file &lt;b&gt;{0}&lt;/b&gt; is &lt;b&gt;{1} KB&lt;/b&gt;. Do you really want to load it?&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Velikost souboru &lt;b&gt;{0}&lt;/b&gt; je &lt;b&gt;{1} KB&lt;/b&gt;. Opravdu jej chcete načíst?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1385"/>
+        <source>&lt;p&gt;No exporter available for the export format &lt;b&gt;{0}&lt;/b&gt;. Aborting...&lt;/p&gt;</source>
+        <translation>&lt;p&gt;Pro formát exportu &lt;b&gt;{0}&lt;/b&gt; není exportér dostupný. Zrušeno.&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1404"/>
         <source>Alternatives ({0})</source>
         <translation>Alternativy ({0})</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2939"/>
+        <location filename="../QScintilla/Editor.py" line="3045"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; has unsaved changes.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; obsahuje neuložené změny.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="2999"/>
+        <location filename="../QScintilla/Editor.py" line="3105"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; could not be opened.&lt;/p&gt;&lt;p&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; nemůže být přejmenován.&lt;br /&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="3125"/>
+        <location filename="../QScintilla/Editor.py" line="3231"/>
         <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; could not be saved.&lt;br/&gt;Reason: {1}&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; nemůže být přejmenován.&lt;br /&gt;Důvod: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6653"/>
+        <location filename="../QScintilla/Editor.py" line="6759"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; could not be read.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor s makrem &lt;b&gt;{0}&lt;/b&gt; nelze načíst.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6662"/>
+        <location filename="../QScintilla/Editor.py" line="6768"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; is corrupt.&lt;/p&gt;</source>
         <translation>&lt;p&gt;Soubor s makrem &lt;b&gt;{0}&lt;/b&gt; je poškozen.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="6715"/>
+        <location filename="../QScintilla/Editor.py" line="6821"/>
         <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; could not be written.&lt;/p&gt;</source>
         <translation>&lt;p&gt;So souboru s makrem &lt;b&gt;{0}&lt;/b&gt; nelze zapisovat.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7059"/>
+        <location filename="../QScintilla/Editor.py" line="7165"/>
         <source>{0} (ro)</source>
         <translation>{0} (ro)</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7200"/>
+        <location filename="../QScintilla/Editor.py" line="7306"/>
         <source>&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt; is not a file.&lt;/p&gt;</source>
         <translation>&lt;p&gt;&lt;b&gt;{0}&lt;/b&gt; není soubor.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="7296"/>
+        <location filename="../QScintilla/Editor.py" line="7402"/>
         <source>Alias for file &lt;b&gt;{0}&lt;/b&gt;:</source>
         <translation>Zástupce pro soubor &lt;b&gt;{0}&lt;/b&gt;:</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1252"/>
+        <location filename="../QScintilla/Editor.py" line="1313"/>
         <source>Next warning</source>
         <translation>Následující varování</translation>
     </message>
     <message>
-        <location filename="../QScintilla/Editor.py" line="1256"/>
+        <location filename="../QScintilla/Editor.py" line="1317"/>
         <source>Previous warning</source>
         <translation>Předchozí varování</translation>
     </message>
     <message>
+        <location filename="../QScintilla/Editor.py" line="1321"/>
+        <source>Show warning message</source>
+        <translation>Zobrazit varování</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1325"/>
+        <source>Clear warnings</source>
+        <translation>Vyčistit varování</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="3294"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; již existuje.&lt;/p&gt;&lt;p&gt;Má se přepsat?&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6805"/>
+        <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6605"/>
+        <source>Warning: {0}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6612"/>
+        <source>Error: {0}</source>
+        <translation type="unfinished">Chyby: {0}</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6996"/>
+        <source>&lt;br&gt;&lt;b&gt;Warning:&lt;/b&gt; You will lose your changes upon reopening it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="915"/>
+        <source>Open &apos;rejection&apos; file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1025"/>
+        <source>Load Diagram...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1348"/>
+        <source>Next change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1352"/>
+        <source>Previous change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8254"/>
+        <source>Sort Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8254"/>
+        <source>The selection contains illegal data for a numerical sort.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6540"/>
+        <source>Warning</source>
+        <translation type="unfinished">Varování</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6540"/>
+        <source>No warning messages available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6602"/>
+        <source>Style: {0}</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="889"/>
+        <source>New Document View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="892"/>
+        <source>New Document View (with new split)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="979"/>
+        <source>Tools</source>
+        <translation type="unfinished">Nástroje</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1110"/>
+        <source>Re-Open With Encoding</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="6990"/>
+        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; has been changed while it was opened in eric6. Reread it?&lt;/p&gt;</source>
+        <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; byl změněn po té co již byl načten do eric5. Znovu načíst?&lt;/p&gt; {0}?} {6.?}</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="865"/>
+        <source>Automatic Completion enabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="945"/>
+        <source>Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4901"/>
+        <source>Auto-Completion Provider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="4901"/>
+        <source>The completion list provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5176"/>
+        <source>Call-Tips Provider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="5176"/>
+        <source>The call-tips provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8343"/>
+        <source>Register Mouse Click Handler</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8343"/>
+        <source>A mouse click handler for &quot;{0}&quot; was already registered by &quot;{1}&quot;. Aborting request by &quot;{2}&quot;...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="909"/>
+        <source>Save Copy...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="948"/>
+        <source>Clear Completions Cache</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="875"/>
+        <source>Code Info</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1356"/>
+        <source>Clear changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="798"/>
+        <source>Execute Selection In Console</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8464"/>
+        <source>EditorConfig Properties</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="8464"/>
+        <source>&lt;p&gt;The EditorConfig properties for file &lt;b&gt;{0}&lt;/b&gt; could not be loaded.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <location filename="../QScintilla/Editor.py" line="1260"/>
-        <source>Show warning message</source>
-        <translation>Zobrazit varování</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1264"/>
-        <source>Clear warnings</source>
-        <translation>Vyčistit varování</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="3188"/>
-        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
-        <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; již existuje.&lt;/p&gt;&lt;p&gt;Má se přepsat?&lt;/p&gt;</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6699"/>
-        <source>&lt;p&gt;The macro file &lt;b&gt;{0}&lt;/b&gt; already exists. Overwrite it?&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6499"/>
-        <source>Warning: {0}</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6506"/>
-        <source>Error: {0}</source>
-        <translation type="unfinished">Chyby: {0}</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6890"/>
-        <source>&lt;br&gt;&lt;b&gt;Warning:&lt;/b&gt; You will lose your changes upon reopening it.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="886"/>
-        <source>Open &apos;rejection&apos; file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="996"/>
-        <source>Load Diagram...</source>
+        <source>Toggle all folds</source>
+        <translation type="unfinished">Složit/rozložit všechna skládání</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1265"/>
+        <source>Toggle all folds (including children)</source>
+        <translation type="unfinished">Složit/rozložit všechna skládání (i s podsložkami)</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1270"/>
+        <source>Toggle current fold</source>
+        <translation type="unfinished">Složit/rozložit aktuální složený blok</translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1276"/>
+        <source>Expand (including children)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1281"/>
+        <source>Collapse (including children)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../QScintilla/Editor.py" line="1287"/>
-        <source>Next change</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1291"/>
-        <source>Previous change</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8118"/>
-        <source>Sort Lines</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8118"/>
-        <source>The selection contains illegal data for a numerical sort.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6434"/>
-        <source>Warning</source>
-        <translation type="unfinished">Varování</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6434"/>
-        <source>No warning messages available.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6496"/>
-        <source>Style: {0}</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="860"/>
-        <source>New Document View</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="863"/>
-        <source>New Document View (with new split)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="950"/>
-        <source>Tools</source>
-        <translation type="unfinished">Nástroje</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1081"/>
-        <source>Re-Open With Encoding</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="6884"/>
-        <source>&lt;p&gt;The file &lt;b&gt;{0}&lt;/b&gt; has been changed while it was opened in eric6. Reread it?&lt;/p&gt;</source>
-        <translation type="unfinished">&lt;p&gt;Soubor &lt;b&gt;{0}&lt;/b&gt; byl změněn po té co již byl načten do eric5. Znovu načíst?&lt;/p&gt; {0}?} {6.?}</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="836"/>
-        <source>Automatic Completion enabled</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="916"/>
-        <source>Complete</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4795"/>
-        <source>Auto-Completion Provider</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="4795"/>
-        <source>The completion list provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5070"/>
-        <source>Call-Tips Provider</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="5070"/>
-        <source>The call-tips provider &apos;{0}&apos; was already registered. Ignoring duplicate request.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8207"/>
-        <source>Register Mouse Click Handler</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8207"/>
-        <source>A mouse click handler for &quot;{0}&quot; was already registered by &quot;{1}&quot;. Aborting request by &quot;{2}&quot;...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="880"/>
-        <source>Save Copy...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="919"/>
-        <source>Clear Completions Cache</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="846"/>
-        <source>Code Info</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1295"/>
-        <source>Clear changes</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="771"/>
-        <source>Execute Selection In Console</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8328"/>
-        <source>EditorConfig Properties</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="8328"/>
-        <source>&lt;p&gt;The EditorConfig properties for file &lt;b&gt;{0}&lt;/b&gt; could not be loaded.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1199"/>
-        <source>Toggle all folds</source>
-        <translation type="unfinished">Složit/rozložit všechna skládání</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1204"/>
-        <source>Toggle all folds (including children)</source>
-        <translation type="unfinished">Složit/rozložit všechna skládání (i s podsložkami)</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1209"/>
-        <source>Toggle current fold</source>
-        <translation type="unfinished">Složit/rozložit aktuální složený blok</translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1215"/>
-        <source>Expand (including children)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1220"/>
-        <source>Collapse (including children)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QScintilla/Editor.py" line="1226"/>
         <source>Clear all folds</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../QScintilla/Editor.py" line="1168"/>
+        <source>Spell Check Languages</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>EditorAPIsPage</name>
@@ -12897,22 +12932,22 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="283"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="313"/>
         <source>Add File Filter</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="243"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="273"/>
         <source>A Save File Filter must contain exactly one wildcard pattern. Yours contains {0}.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="252"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="282"/>
         <source>A File Filter must contain at least one wildcard pattern.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="283"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.py" line="313"/>
         <source>Enter the file filter entry:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -12927,82 +12962,77 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="474"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="517"/>
         <source>Enter the filename extensions of HTML files that may be previewed (separated by a space)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="497"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="542"/>
         <source>Enter the filename extensions of Markdown files that may be previewed (separated by a space)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="550"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="662"/>
         <source>Enter the filename extensions of ReStructuredText files that may be previewed (separated by a space)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="612"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="724"/>
         <source>Enter the filename extensions of Qt Stylesheet files that may be previewed (separated by a space)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="557"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="669"/>
         <source>Select to use &apos;sphinx&apos; to generate the ReST preview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="560"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="672"/>
         <source>Use &apos;sphinx&apos; for ReST preview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="461"/>
-        <source>HTML Files</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="605"/>
-        <source>Extensions:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="484"/>
-        <source>Markdown Files</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="504"/>
-        <source>Select this to convert a new line character to an HTML &amp;lt;br/&amp;gt; tag.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="507"/>
-        <source>Convert New Line to HTML Break</source>
+        <source>HTML Files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="527"/>
+        <source>Markdown Files</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="573"/>
+        <source>Select this to convert a new line character to an HTML &amp;lt;br/&amp;gt; tag.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="576"/>
+        <source>Convert New Line to HTML Break</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="685"/>
         <source>HTML Format:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="586"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="698"/>
         <source>Select the HTML format to be generated</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="537"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="649"/>
         <source>ReST Files</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="567"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="679"/>
         <source>Docutils</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="599"/>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="711"/>
         <source>QSS Files</source>
         <translation type="unfinished"></translation>
     </message>
@@ -13016,6 +13046,72 @@
         <source>Insert final newline upon save</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="607"/>
+        <source>Select to enable the use of the PyMdown extensions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="610"/>
+        <source>&lt;b&gt;Enable PyMdown Extensions&lt;/b&gt;
+&lt;p&gt;Select this entry to enable the use of the PyMdown extensions. These have to be installed with &lt;code&gt;pip install pymdown-extensions&lt;/code&gt;.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="614"/>
+        <source>Enable PyMdown Extensions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="583"/>
+        <source>Select to enable Math support using MathJax</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="586"/>
+        <source>Enable Math support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="593"/>
+        <source>Select to enable Graph support using Mermaid</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="596"/>
+        <source>Enable Graph support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="463"/>
+        <source>Refresh Timeout:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="470"/>
+        <source>Enter the timeout in milliseconds until the preview is refreshed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="473"/>
+        <source> ms</source>
+        <translation type="unfinished"> ms</translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="717"/>
+        <source>File Extensions:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="621"/>
+        <source>Press to install the PyMdown extensions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorFilePage.ui" line="624"/>
+        <source>Install PyMdown Extensions</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>EditorGeneralPage</name>
@@ -14422,27 +14518,27 @@
 <context>
     <name>EditorSpellCheckingPage</name>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="293"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="329"/>
         <source>Select to enable spellchecking</source>
         <translation>Vybrat pro zapnutí kontroly pravopisu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="117"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="119"/>
         <source>Select to check strings only</source>
         <translation>Vybrat pro kontrolu jen stringů</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="129"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="143"/>
         <source>Minimum word size:</source>
         <translation>Minimální délka slova:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="136"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="150"/>
         <source>Move to set the minimum size of words to be checked</source>
         <translation>Posunout pro nastavení minimální délky slov, které se kontrolují</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="158"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="172"/>
         <source>Displays the minimum size of words to be checked</source>
         <translation>Zobrazuje minimální délku slov, které se kontrolují</translation>
     </message>
@@ -14457,12 +14553,12 @@
         <translation>Vybrat výchozí jazyk</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="185"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="221"/>
         <source>Marker Colour:</source>
         <translation>Barva značky:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="198"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="234"/>
         <source>Select the colour for the spelling markers.</source>
         <translation>Vybraz barvu značek kontroly.</translation>
     </message>
@@ -14487,57 +14583,57 @@
         <translation>Nastavení kontroly</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="120"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="122"/>
         <source>Spell check strings only</source>
         <translation>Kontrolovat jen stringy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="179"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="215"/>
         <source>Colours</source>
         <translation>Barvy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="224"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="260"/>
         <source>Personal lists</source>
         <translation>Vlastní seznamy</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="230"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="266"/>
         <source>Personal word list file:</source>
         <translation>Soubor s vlastním seznamerm slov:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="250"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="286"/>
         <source>Personal exclude list file:</source>
         <translation>Soubor s vlastním seznamem vyřazených:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="270"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="306"/>
         <source>&lt;b&gt;Note:&lt;/b&gt; leave these entries empty to use the default</source>
         <translation>&lt;b&gt;Poznámka:&lt;/b&gt; pro použití výchozí hodnoty ponechte prázdné</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="277"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="313"/>
         <source>&lt;b&gt;Note:&lt;/b&gt; valid for all newly opened editors</source>
         <translation>&lt;b&gt;Poznámka:&lt;/b&gt; platné pro všechny nově otevřené editory</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="287"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="323"/>
         <source>Automatic spell checking</source>
         <translation>Automatická kontrola pravopisu</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="296"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="332"/>
         <source>Automatic spell checking enabled</source>
         <translation>Automatická kontrola pravopisu zapnuta</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="305"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="341"/>
         <source>Amount of lines to autocheck at once:</source>
         <translation>Počet řádek kontrolovaných najednou:</translation>
     </message>
     <message>
-        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="312"/>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="348"/>
         <source>Enter the number of lines to check per go. Higher values increase checking speed but decrease GUI responsivenes</source>
         <translation>Zadejte počet řádek, které se budou kontrolovat najednou. Vyšší hodnota zvyšuje rychlost kontroly ale snižuje GUI plynulost</translation>
     </message>
@@ -14556,6 +14652,32 @@
         <source>Spell checking enabled</source>
         <translation>Kontrola pravopisu zapnuta</translation>
     </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="129"/>
+        <source>Select to perform a complete check of files without extension</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="132"/>
+        <source>Spell check unknown files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="192"/>
+        <source>Textfiles:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="199"/>
+        <source>Enter the file extensions of pure text files (separated by a space)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../Preferences/ConfigurationPages/EditorSpellCheckingPage.ui" line="202"/>
+        <source>&lt;b&gt;Textfiles&lt;/b&gt;
+&lt;p&gt;Enter the file extension of pure text files. The complete contents of files with these extensions will be checked.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>EditorStylesPage</name>
@@ -21730,11 +21852,6 @@
 <context>
     <name>GitPage</name>
     <message>
-        <location filename="../Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.ui" line="14"/>
-        <source>Select to perform an expensive copy detection</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.ui" line="20"/>
         <source>&lt;b&gt;Configure Git Interface&lt;/b&gt;</source>
         <translation type="unfinished"></translation>
@@ -45807,27 +45924,27 @@
 <context>
     <name>MicroPythonDevice</name>
     <message>
-        <location filename="../MicroPython/MicroPythonDevices.py" line="194"/>
+        <location filename="../MicroPython/MicroPythonDevices.py" line="207"/>
         <source>Unsupported Device</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicroPythonDevices.py" line="204"/>
+        <location filename="../MicroPython/MicroPythonDevices.py" line="217"/>
         <source>REPL is not supported by this device.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicroPythonDevices.py" line="223"/>
+        <location filename="../MicroPython/MicroPythonDevices.py" line="236"/>
         <source>Plotter is not supported by this device.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicroPythonDevices.py" line="242"/>
+        <location filename="../MicroPython/MicroPythonDevices.py" line="255"/>
         <source>Running scripts is not supported by this device.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicroPythonDevices.py" line="262"/>
+        <location filename="../MicroPython/MicroPythonDevices.py" line="275"/>
         <source>File Manager is not supported by this device.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -46598,75 +46715,70 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="218"/>
-        <source>Flash Default MicroPython Firmware</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="207"/>
-        <source>Flash Custom MicroPython Firmware</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="258"/>
-        <source>Flash Script</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <location filename="../MicroPython/MicrobitDevices.py" line="171"/>
-        <source>Flash the current script to the selected device.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="300"/>
         <source>Save Script as &apos;main.py&apos;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="176"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="173"/>
         <source>Save the current script as &apos;main.py&apos; on the connected device</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="180"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="177"/>
         <source>Reset micro:bit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="183"/>
-        <source>Install &apos;uflash&apos;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="258"/>
-        <source>&apos;uflash&apos; Output</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="207"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="201"/>
         <source>MicroPython Firmware Files (*.hex);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="235"/>
-        <source>The current editor does not contain a Python script. Flash it anyway?</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="285"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="246"/>
         <source>The script is empty. Aborting.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="275"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="236"/>
         <source>The current editor does not contain a Python script. Write it anyway?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../MicroPython/MicrobitDevices.py" line="300"/>
+        <location filename="../MicroPython/MicrobitDevices.py" line="274"/>
         <source>&lt;p&gt;The script could not be saved to the device.&lt;/p&gt;&lt;p&gt;Reason: {0}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="201"/>
+        <source>Flash MicroPython Firmware</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="233"/>
+        <source>Save Script</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="190"/>
+        <source>The BBC micro:bit is not ready for flashing. See the &lt;a href=&quot;https://microbit.org/guide/firmware/&quot;&gt;micro:bit web site&lt;/a&gt; for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="263"/>
+        <source>Save Script as &apos;{0}&apos;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="254"/>
+        <source>Enter a file name on the device:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/MicrobitDevices.py" line="168"/>
+        <source>Save the current script to the selected device</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>MicrosoftEngine</name>
@@ -48408,47 +48520,47 @@
 <context>
     <name>NetworkManager</name>
     <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="202"/>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="188"/>
         <source>SSL Certificate Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="189"/>
+        <source>&lt;b&gt;{0}&lt;/b&gt;&lt;p&gt;The page you are trying to access has errors in the SSL certificate.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{1}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Would you like to make an exception?&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="199"/>
+        <source>&amp;Permanent accept</source>
+        <translation type="unfinished">Akce&amp;ptovat natrvalo</translation>
+    </message>
+    <message>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="201"/>
+        <source>&amp;Temporary accept</source>
+        <translation type="unfinished">Akcep&amp;tovat dočasně</translation>
+    </message>
+    <message>
         <location filename="../WebBrowser/Network/NetworkManager.py" line="203"/>
-        <source>&lt;b&gt;{0}&lt;/b&gt;&lt;p&gt;The page you are trying to access has errors in the SSL certificate.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;{1}&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Would you like to make an exception?&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="213"/>
-        <source>&amp;Permanent accept</source>
-        <translation type="unfinished">Akce&amp;ptovat natrvalo</translation>
-    </message>
-    <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="215"/>
-        <source>&amp;Temporary accept</source>
-        <translation type="unfinished">Akcep&amp;tovat dočasně</translation>
-    </message>
-    <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="217"/>
         <source>&amp;Reject</source>
         <translation type="unfinished">&amp;Odmítnout</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="251"/>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="237"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</source>
         <translation type="unfinished">&lt;b&gt;Zadejte uživatelské jméno a heslo pro {0}&apos;, realm &apos;{1}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="255"/>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="241"/>
         <source>&lt;b&gt;Enter username and password for &apos;{0}&apos;&lt;/b&gt;</source>
         <translation type="unfinished">&lt;b&gt;Zadejte uživatelské jméno a heslo pro &apos;{0}&apos;&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="303"/>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="289"/>
         <source>Authentication required</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../WebBrowser/Network/NetworkManager.py" line="304"/>
+        <location filename="../WebBrowser/Network/NetworkManager.py" line="290"/>
         <source>Authentication is required to access:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -51919,17 +52031,17 @@
 <context>
     <name>Preferences</name>
     <message>
-        <location filename="../Preferences/__init__.py" line="1596"/>
+        <location filename="../Preferences/__init__.py" line="1606"/>
         <source>Export Preferences</source>
         <translation>Předvolby exportu</translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1624"/>
+        <location filename="../Preferences/__init__.py" line="1634"/>
         <source>Import Preferences</source>
         <translation>Předvolby importu</translation>
     </message>
     <message>
-        <location filename="../Preferences/__init__.py" line="1624"/>
+        <location filename="../Preferences/__init__.py" line="1634"/>
         <source>Properties File (*.ini);;All Files (*)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -51958,27 +52070,27 @@
 <context>
     <name>PreviewProcessingThread</name>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="439"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="464"/>
         <source>&lt;p&gt;No preview available for this type of file.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="606"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="631"/>
         <source>&lt;p&gt;ReStructuredText preview requires the &lt;b&gt;python-docutils&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager, &apos;pip install docutils&apos; or see &lt;a href=&quot;http://pypi.python.org/pypi/docutils&quot;&gt;this page.&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="549"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="574"/>
         <source>&lt;p&gt;ReStructuredText preview requires the &lt;b&gt;sphinx&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager,&apos;pip install Sphinx&apos; or see &lt;a href=&quot;http://pypi.python.org/pypi/Sphinx&quot;&gt;this page.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Alternatively you may disable Sphinx usage on the Editor, Filehandling configuration page.&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="641"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="674"/>
         <source>&lt;p&gt;Markdown preview requires the &lt;b&gt;Markdown&lt;/b&gt; package.&lt;br/&gt;Install it with your package manager, &apos;pip install Markdown&apos; or see &lt;a href=&quot;http://pythonhosted.org/Markdown/install.html&quot;&gt;installation instructions.&lt;/a&gt;&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="621"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="646"/>
         <source>&lt;p&gt;Docutils returned an error:&lt;/p&gt;&lt;p&gt;{0}&lt;/p&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -52011,12 +52123,12 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="252"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="254"/>
         <source>Preview - {0}</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../UI/Previewers/PreviewerHTML.py" line="254"/>
+        <location filename="../UI/Previewers/PreviewerHTML.py" line="256"/>
         <source>Preview</source>
         <translation type="unfinished"></translation>
     </message>
@@ -55931,6 +56043,29 @@
     </message>
 </context>
 <context>
+    <name>PyBoardDevice</name>
+    <message>
+        <location filename="../MicroPython/PyBoardDevices.py" line="70"/>
+        <source>PyBoard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/PyBoardDevices.py" line="159"/>
+        <source>Workspace Directory</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/PyBoardDevices.py" line="159"/>
+        <source>Python files for PyBoard devices are stored on the device. Therefore, to edit these files you need to have the device plugged in. Until you plug in a device, the standard directory will be used.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../MicroPython/PyBoardDevices.py" line="186"/>
+        <source>MicroPython Install Instructions</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>PyCoverageDialog</name>
     <message>
         <location filename="../DataViews/PyCoverageDialog.ui" line="20"/>
@@ -76605,693 +76740,693 @@
 <context>
     <name>UserInterface</name>
     <message>
-        <location filename="../UI/UserInterface.py" line="271"/>
+        <location filename="../UI/UserInterface.py" line="274"/>
         <source>Generating Main User Interface...</source>
         <translation>Generování hlavního uživatelského rozhraní...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="321"/>
+        <location filename="../UI/UserInterface.py" line="324"/>
         <source>Setting up connections...</source>
         <translation>Nastavení připojení...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="573"/>
+        <location filename="../UI/UserInterface.py" line="577"/>
         <source>Initializing Tools...</source>
         <translation>Inicializace nástrojů...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="583"/>
+        <location filename="../UI/UserInterface.py" line="587"/>
         <source>Registering Objects...</source>
         <translation>Registrování objektů...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="616"/>
-        <source>Initializing Actions...</source>
-        <translation>Inicializace akcí...</translation>
-    </message>
-    <message>
-        <location filename="../UI/UserInterface.py" line="618"/>
-        <source>Initializing Menus...</source>
-        <translation>Inicializace menu...</translation>
-    </message>
-    <message>
         <location filename="../UI/UserInterface.py" line="620"/>
-        <source>Initializing Toolbars...</source>
-        <translation>Inicializace nástrojových lišt...</translation>
+        <source>Initializing Actions...</source>
+        <translation>Inicializace akcí...</translation>
     </message>
     <message>
         <location filename="../UI/UserInterface.py" line="622"/>
+        <source>Initializing Menus...</source>
+        <translation>Inicializace menu...</translation>
+    </message>
+    <message>
+        <location filename="../UI/UserInterface.py" line="624"/>
+        <source>Initializing Toolbars...</source>
+        <translation>Inicializace nástrojových lišt...</translation>
+    </message>
+    <message>
+        <location filename="../UI/UserInterface.py" line="626"/>
         <source>Initializing Statusbar...</source>
         <translation>Inicializace statusbaru...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="649"/>
+        <location filename="../UI/UserInterface.py" line="653"/>
         <source>Initializing Single Application Server...</source>
         <translation>Inicializace jednouživatelského aplikačního serveru...</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1630"/>
+        <location filename="../UI/UserInterface.py" line="1634"/>
         <source>Project-Viewer</source>
         <translation>Prohlížeč projektu</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1665"/>
+        <location filename="../UI/UserInterface.py" line="1669"/>
         <source>Debug-Viewer</source>
         <translation>Prohlížeč debugeru</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1717"/>
+        <location filename="../UI/UserInterface.py" line="1721"/>
         <source>Log-Viewer</source>
         <translation>Prohlížeč logu</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1735"/>
+        <location filename="../UI/UserInterface.py" line="1739"/>
         <source>Task-Viewer</source>
         <translation>Prohlížeč úloh</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1754"/>
+        <location filename="../UI/UserInterface.py" line="1758"/>
         <source>Template-Viewer</source>
         <translation>Prohlížeč šablon</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1683"/>
+        <location filename="../UI/UserInterface.py" line="1687"/>
         <source>Shell</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1700"/>
+        <location filename="../UI/UserInterface.py" line="1704"/>
         <source>File-Browser</source>
         <translation>Browser souborů</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1518"/>
+        <location filename="../UI/UserInterface.py" line="1522"/>
         <source>Quit</source>
         <translation>Konec</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1518"/>
+        <location filename="../UI/UserInterface.py" line="1522"/>
         <source>&amp;Quit</source>
         <translation>&amp;Konec</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1518"/>
+        <location filename="../UI/UserInterface.py" line="1522"/>
         <source>Ctrl+Q</source>
         <comment>File|Quit</comment>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1524"/>
+        <location filename="../UI/UserInterface.py" line="1528"/>
         <source>Quit the IDE</source>
         <translation>Ukončit IDE</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1525"/>
+        <location filename="../UI/UserInterface.py" line="1529"/>
         <source>&lt;b&gt;Quit the IDE&lt;/b&gt;&lt;p&gt;This quits the IDE. Any unsaved changes may be saved first. Any Python program being debugged will be stopped and the preferences will be written to disc.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Ukončit IDE&lt;/b&gt;&lt;p&gt;Ukončí se IDE. Nejdříve by se měly uložit neuložené změny. Python programy běžící v debug procesu budou ukončeny a nastavení budou uložena.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1596"/>
+        <location filename="../UI/UserInterface.py" line="1600"/>
         <source>Edit Profile</source>
         <translation>Editační profil</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1602"/>
+        <location filename="../UI/UserInterface.py" line="1606"/>
         <source>Activate the edit view profile</source>
         <translation>Aktivovat profil editace</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1604"/>
+        <location filename="../UI/UserInterface.py" line="1608"/>
         <source>&lt;b&gt;Edit Profile&lt;/b&gt;&lt;p&gt;Activate the &quot;Edit View Profile&quot;. Windows being shown, if this profile is active, may be configured with the &quot;View Profile Configuration&quot; dialog.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Editační profil&lt;/b&gt;&lt;p&gt;Aktivování skupiny &apos;Editační profil&apos;. Okna, která se v tomto profilu zobrazí lze nastavit v dialogu &apos;Konfigurace profilu pohledů&apos;.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1613"/>
+        <location filename="../UI/UserInterface.py" line="1617"/>
         <source>Debug Profile</source>
         <translation>Debugovací profil</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1619"/>
+        <location filename="../UI/UserInterface.py" line="1623"/>
         <source>Activate the debug view profile</source>
         <translation>Aktivovat debugovací profil</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1621"/>
+        <location filename="../UI/UserInterface.py" line="1625"/>
         <source>&lt;b&gt;Debug Profile&lt;/b&gt;&lt;p&gt;Activate the &quot;Debug View Profile&quot;. Windows being shown, if this profile is active, may be configured with the &quot;View Profile Configuration&quot; dialog.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Debugovací profil&lt;/b&gt;&lt;p&gt;Aktivování skupiny &apos;Debugovací profil&apos;. Okna, která se v tomto profilu zobrazí lze nastavit v dialogu &apos;Konfigurace profilu pohledů&apos;.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1630"/>
+        <location filename="../UI/UserInterface.py" line="1634"/>
         <source>&amp;Project-Viewer</source>
         <translation>Prohlížeč &amp;projektu</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1630"/>
+        <location filename="../UI/UserInterface.py" line="1634"/>
         <source>Alt+Shift+P</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1665"/>
+        <location filename="../UI/UserInterface.py" line="1669"/>
         <source>Alt+Shift+D</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1683"/>
+        <location filename="../UI/UserInterface.py" line="1687"/>
         <source>&amp;Shell</source>
         <translation>&amp;Shell</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1683"/>
+        <location filename="../UI/UserInterface.py" line="1687"/>
         <source>Alt+Shift+S</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1700"/>
+        <location filename="../UI/UserInterface.py" line="1704"/>
         <source>Alt+Shift+F</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1717"/>
+        <location filename="../UI/UserInterface.py" line="1721"/>
         <source>Alt+Shift+G</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1735"/>
+        <location filename="../UI/UserInterface.py" line="1739"/>
         <source>Alt+Shift+T</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="1647"/>
+        <location filename="../UI/UserInterface.py" line="1651"/>
         <source>Alt+Shift+M</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2002"/>
+        <location filename="../UI/UserInterface.py" line="2006"/>
         <source>What&apos;s This?</source>
         <translation>Co je to?</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2002"/>
+        <location filename="../UI/UserInterface.py" line="2006"/>
         <source>&amp;What&apos;s This?</source>
         <translation>&amp;Co je to?</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2002"/>
+        <location filename="../UI/UserInterface.py" line="2006"/>
         <source>Shift+F1</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2008"/>
+        <location filename="../UI/UserInterface.py" line="2012"/>
         <source>Context sensitive help</source>
         <translation>Kontextově senzitivní nápověda</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2009"/>
+        <location filename="../UI/UserInterface.py" line="2013"/>
         <source>&lt;b&gt;Display context sensitive help&lt;/b&gt;&lt;p&gt;In What&apos;s This? mode, the mouse cursor shows an arrow with a question mark, and you can click on the interface elements to get a short description of what they do and how to use them. In dialogs, this feature can be accessed using the context help button in the titlebar.&lt;/p&gt;</source>
         <translation>&lt;b&gt;Zobrazit kontextově senzitivní nápovědu&lt;/b&gt;&lt;p&gt;V režimu &quot;Co je to?&quot; se nad různými prvky aplikace u kurzoru zobrazí otazník. Když pak kliknete na tyto prvky, zobrazí se krátký popis co daný prvek znamená a jak jej použít. V dialogových oknech se tato funkce spustí tlačítkem kontextové nápovědy na horní liště.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2020"/>
+        <location filename="../UI/UserInterface.py" line="2024"/>
         <source>Helpviewer</source>
         <translation>Prohlížeč nápovědy</translation>
     </message>
     <message>
-        <location filename="../UI/UserInterface.py" line="2020"/>
+        <location filename="../UI/UserInterface.py" line="2024"/>
         <source>&amp;Helpviewer...</source>
         <translation>Pro&amp;hlížeč nápovědy...</translation>
     </message>