PreviewerHTML, ExporterHTML:

Fri, 25 Oct 2019 20:15:51 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 25 Oct 2019 20:15:51 +0200
changeset 7314
c32c24345ca7
parent 7313
2373d03cd63a
child 7315
41fdf2cd1c33

PreviewerHTML, ExporterHTML:
- enhanced the Markdown generated HTML with an embedded style sheet.

eric6.e4p file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.api file | annotate | diff | comparison | revisions
eric6/APIs/Python3/eric6.bas 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.Exporters.ExporterHTML.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.UI.Previewers.MarkdownExtensions.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTML.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTMLStyles.html file | annotate | diff | comparison | revisions
eric6/Documentation/Source/index-eric6.UI.Previewers.html file | annotate | diff | comparison | revisions
eric6/QScintilla/Exporters/ExporterHTML.py file | annotate | diff | comparison | revisions
eric6/UI/Previewers/MarkdownExtensions.py file | annotate | diff | comparison | revisions
eric6/UI/Previewers/PreviewerHTML.py file | annotate | diff | comparison | revisions
eric6/UI/Previewers/PreviewerHTMLStyles.py file | annotate | diff | comparison | revisions
--- a/eric6.e4p	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6.e4p	Fri Oct 25 20:15:51 2019 +0200
@@ -1198,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>
--- a/eric6/APIs/Python3/eric6.api	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/APIs/Python3/eric6.api	Fri Oct 25 20:15:51 2019 +0200
@@ -7430,14 +7430,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._CaretExtension.INS_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._CaretExtension.SUP_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._CaretExtension.extendMarkdown?4(md, md_globals)
-eric6.QScintilla.Exporters.ExporterHTML._MarkExtension.MARK_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._MarkExtension.extendMarkdown?4(md, md_globals)
-eric6.QScintilla.Exporters.ExporterHTML._TildeExtension.DEL_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._TildeExtension.SUB_RE?7
-eric6.QScintilla.Exporters.ExporterHTML._TildeExtension.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()
@@ -8837,6 +8829,16 @@
 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, usePyMdownExtensions, markdownHtmlFormat, restDocutilsHtmlFormat)
 eric6.UI.Previewers.PreviewerHTML.PreviewProcessingThread.run?4()
@@ -8848,14 +8850,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._CaretExtension.INS_RE?7
-eric6.UI.Previewers.PreviewerHTML._CaretExtension.SUP_RE?7
-eric6.UI.Previewers.PreviewerHTML._CaretExtension.extendMarkdown?4(md, md_globals)
-eric6.UI.Previewers.PreviewerHTML._MarkExtension.MARK_RE?7
-eric6.UI.Previewers.PreviewerHTML._MarkExtension.extendMarkdown?4(md, md_globals)
-eric6.UI.Previewers.PreviewerHTML._TildeExtension.DEL_RE?7
-eric6.UI.Previewers.PreviewerHTML._TildeExtension.SUB_RE?7
-eric6.UI.Previewers.PreviewerHTML._TildeExtension.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
--- a/eric6/APIs/Python3/eric6.bas	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/APIs/Python3/eric6.bas	Fri Oct 25 20:15:51 2019 +0200
@@ -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
@@ -803,6 +805,7 @@
 ShortcutsDialog QDialog Ui_ShortcutsDialog
 ShortcutsReader XMLStreamReaderBase
 ShortcutsWriter XMLStreamWriterBase
+SimplePatternExtension Extension
 SingleApplicationServer QLocalServer
 SiteInfoDialog QDialog Ui_SiteInfoDialog
 SiteInfoWidget QMenu
@@ -1025,6 +1028,3 @@
 ZoomManager QObject
 ZoomValuesDialog QDialog Ui_ZoomValuesDialog
 ZoomValuesModel QAbstractTableModel
-_CaretExtension markdown.Extension
-_MarkExtension markdown.Extension
-_TildeExtension markdown.Extension
Binary file eric6/Documentation/Help/source.qch has changed
--- a/eric6/Documentation/Help/source.qhp	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/Documentation/Help/source.qhp	Fri Oct 25 20:15:51 2019 +0200
@@ -937,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">
@@ -9501,6 +9503,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" />
@@ -9574,6 +9577,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" />
@@ -11052,6 +11059,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" />
@@ -12988,6 +12996,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__" />
@@ -16888,21 +16898,9 @@
       <keyword name="ZoomValuesModel.headerData" id="ZoomValuesModel.headerData" ref="eric6.WebBrowser.ZoomManager.ZoomValuesModel.html#ZoomValuesModel.headerData" />
       <keyword name="ZoomValuesModel.removeRows" id="ZoomValuesModel.removeRows" ref="eric6.WebBrowser.ZoomManager.ZoomValuesModel.html#ZoomValuesModel.removeRows" />
       <keyword name="ZoomValuesModel.rowCount" id="ZoomValuesModel.rowCount" ref="eric6.WebBrowser.ZoomManager.ZoomValuesModel.html#ZoomValuesModel.rowCount" />
-      <keyword name="_CaretExtension" id="_CaretExtension" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_CaretExtension" />
-      <keyword name="_CaretExtension" id="_CaretExtension" ref="eric6.UI.Previewers.PreviewerHTML.html#_CaretExtension" />
-      <keyword name="_CaretExtension.extendMarkdown" id="_CaretExtension.extendMarkdown" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_CaretExtension.extendMarkdown" />
-      <keyword name="_CaretExtension.extendMarkdown" id="_CaretExtension.extendMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#_CaretExtension.extendMarkdown" />
       <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="_MarkExtension" id="_MarkExtension" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_MarkExtension" />
-      <keyword name="_MarkExtension" id="_MarkExtension" ref="eric6.UI.Previewers.PreviewerHTML.html#_MarkExtension" />
-      <keyword name="_MarkExtension.extendMarkdown" id="_MarkExtension.extendMarkdown" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_MarkExtension.extendMarkdown" />
-      <keyword name="_MarkExtension.extendMarkdown" id="_MarkExtension.extendMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#_MarkExtension.extendMarkdown" />
-      <keyword name="_TildeExtension" id="_TildeExtension" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_TildeExtension" />
-      <keyword name="_TildeExtension" id="_TildeExtension" ref="eric6.UI.Previewers.PreviewerHTML.html#_TildeExtension" />
-      <keyword name="_TildeExtension.extendMarkdown" id="_TildeExtension.extendMarkdown" ref="eric6.QScintilla.Exporters.ExporterHTML.html#_TildeExtension.extendMarkdown" />
-      <keyword name="_TildeExtension.extendMarkdown" id="_TildeExtension.extendMarkdown" ref="eric6.UI.Previewers.PreviewerHTML.html#_TildeExtension.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" />
@@ -18583,7 +18581,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.QScintilla.Exporters.ExporterHTML.html	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Exporters.ExporterHTML.html	Fri Oct 25 20:15:51 2019 +0200
@@ -42,18 +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="#_CaretExtension">_CaretExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
-<tr>
-<td><a href="#_MarkExtension">_MarkExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
-<tr>
-<td><a href="#_TildeExtension">_TildeExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
 </table>
 <h3>Functions</h3>
 
@@ -262,139 +250,4 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
-<hr />
-<a NAME="_CaretExtension" ID="_CaretExtension"></a>
-<h2>_CaretExtension</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>INS_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="#_CaretExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_CaretExtension.extendMarkdown" ID="_CaretExtension.extendMarkdown"></a>
-<h4>_CaretExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="_MarkExtension" ID="_MarkExtension"></a>
-<h2>_MarkExtension</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>MARK_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_MarkExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_MarkExtension.extendMarkdown" ID="_MarkExtension.extendMarkdown"></a>
-<h4>_MarkExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="_TildeExtension" ID="_TildeExtension"></a>
-<h2>_TildeExtension</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><tr><td>SUB_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_TildeExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_TildeExtension.extendMarkdown" ID="_TildeExtension.extendMarkdown"></a>
-<h4>_TildeExtension.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.MarkdownExtensions.html	Fri Oct 25 20:15:51 2019 +0200
@@ -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 24 19:34:53 2019 +0200
+++ b/eric6/Documentation/Source/eric6.UI.Previewers.PreviewerHTML.html	Fri Oct 25 20:15:51 2019 +0200
@@ -42,18 +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="#_CaretExtension">_CaretExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
-<tr>
-<td><a href="#_MarkExtension">_MarkExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
-<tr>
-<td><a href="#_TildeExtension">_TildeExtension</a></td>
-<td>Class is placed here, because it depends on imported markdown, and markdown import is lazy.</td>
-</tr>
 </table>
 <h3>Functions</h3>
 
@@ -716,139 +704,4 @@
 </p>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
-<hr />
-<a NAME="_CaretExtension" ID="_CaretExtension"></a>
-<h2>_CaretExtension</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>INS_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="#_CaretExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_CaretExtension.extendMarkdown" ID="_CaretExtension.extendMarkdown"></a>
-<h4>_CaretExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="_MarkExtension" ID="_MarkExtension"></a>
-<h2>_MarkExtension</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>MARK_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_MarkExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_MarkExtension.extendMarkdown" ID="_MarkExtension.extendMarkdown"></a>
-<h4>_MarkExtension.extendMarkdown</h4>
-<b>extendMarkdown</b>(<i>md, md_globals</i>)
-
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="_TildeExtension" ID="_TildeExtension"></a>
-<h2>_TildeExtension</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><tr><td>SUB_RE</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#_TildeExtension.extendMarkdown">extendMarkdown</a></td>
-<td></td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="_TildeExtension.extendMarkdown" ID="_TildeExtension.extendMarkdown"></a>
-<h4>_TildeExtension.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 Oct 25 20:15:51 2019 +0200
@@ -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/index-eric6.UI.Previewers.html	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/Documentation/Source/index-eric6.UI.Previewers.html	Fri Oct 25 20:15:51 2019 +0200
@@ -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/QScintilla/Exporters/ExporterHTML.py	Thu Oct 24 19:34:53 2019 +0200
+++ b/eric6/QScintilla/Exporters/ExporterHTML.py	Fri Oct 25 20:15:51 2019 +0200
@@ -525,14 +525,18 @@
             )
             return ""
         
+        from UI.Previewers import PreviewerHTMLStyles
+        from UI.Previewers import MarkdownExtensions
+        
         extensions = []
         
+        text = self.editor.text()
+        
+        mermaidNeeded = False
         if Preferences.getEditor("PreviewMarkdownMermaid"):
-            try:
-                import md_mermaid   # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
-                extensions.append("md_mermaid")
-            except ImportError:
-                pass
+            if MarkdownExtensions.MermaidRegex.search(text):
+                extensions.append(MarkdownExtensions.MermaidExtension())
+                mermaidNeeded = True
         
         if Preferences.getEditor("PreviewMarkdownNLtoBR"):
             extensions.append('nl2br')
@@ -544,6 +548,7 @@
                 # PyPI package is 'pymdown-extensions'
                 
                 extensions.extend([
+                    'toc',
                     'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
                     'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
                     'pymdownx.tasklist', 'pymdownx.smartsymbols',
@@ -561,76 +566,7 @@
                 (markdown.version_info[0] == 2 and
                  markdown.version_info[1] > 0)
             ):
-                class _TildeExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    DEL_RE = r'(~~)(.+?)~~'
-                    SUB_RE = r'(~)(.+?)~'
-                    
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the sub pattern and insert it into markdown
-                        # parser
-                        sub_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.SUB_RE, 'sub')
-                        md.inlinePatterns.add('sub', sub_tag, '>not_strong')
-                        
-                        # Create the del pattern and insert it into markdown
-                        # parser
-                        del_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.DEL_RE, 'del')
-                        md.inlinePatterns.add('del', del_tag, '>not_strong')
-                
-                class _CaretExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    INS_RE = r'(\^\^)(.*?)\^\^'
-                    SUP_RE = r'(\^)(.*?)\^'
-                    
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the sup pattern and insert it into markdown
-                        # parser
-                        sup_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.SUP_RE, 'sup')
-                        md.inlinePatterns.add('sup', sup_tag, '>not_strong')
-                        
-                        # Create the ins pattern and insert it into markdown
-                        # parser
-                        ins_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.INS_RE, 'ins')
-                        md.inlinePatterns.add('ins', ins_tag, '>not_strong')
-                
-                class _MarkExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    MARK_RE = r'(==)(.*?)=='
-                    
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the mark pattern and insert it into markdown
-                        # parser
-                        mark_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.MARK_RE, 'mark')
-                        md.inlinePatterns.add('mark', mark_tag, '>not_strong')
-                
-                extensions.extend([
-                    _TildeExtension(), _CaretExtension(), _MarkExtension()
-                ])
-        
-        text = self.editor.text()
+                extensions.append(MarkdownExtensions.SimplePatternExtension())
         
         if Preferences.getEditor("PreviewMarkdownMathJax"):
             mathjax = (
@@ -650,7 +586,7 @@
         else:
             mathjax = ""
         
-        if Preferences.getEditor("PreviewMarkdownMermaid"):
+        if mermaidNeeded:
             mermaid = (
                 "<script type='text/javascript' id='Mermaid-script'"
                 " src='https://unpkg.com/mermaid@8/dist/mermaid.min.js'>\n"
@@ -691,9 +627,16 @@
             '''content="text/html; charset=utf-8" />\n'''
             '''{0}'''
             '''{1}'''
+            '''<style type="text/css">'''
+            '''{2}'''
+            '''</style>\n'''
             '''</head>\n'''
             '''<body>\n'''
-        ).format(mathjax, mermaid)
+        ).format(
+            mathjax, mermaid,
+            PreviewerHTMLStyles.css_markdown +
+            PreviewerHTMLStyles.css_pygments
+        )
         
         foot = '''\n</body>\n</html>\n'''
         
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/UI/Previewers/MarkdownExtensions.py	Fri Oct 25 20:15:51 2019 +0200
@@ -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 24 19:34:53 2019 +0200
+++ b/eric6/UI/Previewers/PreviewerHTML.py	Fri Oct 25 20:15:51 2019 +0200
@@ -678,14 +678,16 @@
                 """<a href="http://pythonhosted.org/Markdown/install.html">"""
                 """installation instructions.</a></p>""")
         
+        from . import PreviewerHTMLStyles
+        from . import MarkdownExtensions
+        
         extensions = []
         
+        mermaidNeeded = False
         if Preferences.getEditor("PreviewMarkdownMermaid"):
-            try:
-                import md_mermaid   # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
-                extensions.append("md_mermaid")
-            except ImportError:
-                pass
+            if MarkdownExtensions.MermaidRegexFullText.search(text):
+                extensions.append(MarkdownExtensions.MermaidExtension())
+                mermaidNeeded = True
         
         if convertNewLineToBreak:
             extensions.append('nl2br')
@@ -697,6 +699,7 @@
                 # PyPI package is 'pymdown-extensions'
                 
                 extensions.extend([
+                    'toc',
                     'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
                     'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
                     'pymdownx.tasklist', 'pymdownx.smartsymbols',
@@ -714,74 +717,7 @@
                 (markdown.version_info[0] == 2 and
                  markdown.version_info[1] > 0)
             ):
-                class _TildeExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    DEL_RE = r'(~~)(.+?)~~'
-                    SUB_RE = r'(~)(.+?)~'
-
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the sub pattern and insert it into markdown
-                        # parser
-                        sub_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.SUB_RE, 'sub')
-                        md.inlinePatterns.add('sub', sub_tag, '>not_strong')
-                        
-                        # Create the del pattern and insert it into markdown
-                        # parser
-                        del_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.DEL_RE, 'del')
-                        md.inlinePatterns.add('del', del_tag, '>not_strong')
-                
-                class _CaretExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    INS_RE = r'(\^\^)(.*?)\^\^'
-                    SUP_RE = r'(\^)(.*?)\^'
-                    
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the sup pattern and insert it into markdown
-                        # parser
-                        sup_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.SUP_RE, 'sup')
-                        md.inlinePatterns.add('sup', sup_tag, '>not_strong')
-                        
-                        # Create the ins pattern and insert it into markdown
-                        # parser
-                        ins_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.INS_RE, 'ins')
-                        md.inlinePatterns.add('ins', ins_tag, '>not_strong')
-                
-                class _MarkExtension(markdown.Extension):
-                    """
-                    Class is placed here, because it depends on imported
-                    markdown, and markdown import is lazy.
-                    
-                    (see https://pythonhosted.org/Markdown/extensions/api.html
-                    this page for details)
-                    """
-                    MARK_RE = r'(==)(.*?)=='
-                    
-                    def extendMarkdown(self, md, md_globals):
-                        # Create the mark pattern and insert it into markdown
-                        # parser
-                        mark_tag = markdown.inlinepatterns.SimpleTagPattern(
-                            self.MARK_RE, 'mark')
-                        md.inlinePatterns.add('mark', mark_tag, '>not_strong')
-                
-                extensions.extend([
-                    _TildeExtension(), _CaretExtension(), _MarkExtension()
-                ])
+                extensions.append(MarkdownExtensions.SimplePatternExtension())
 
         if Preferences.getEditor("PreviewMarkdownMathJax"):
             mathjax = (
@@ -801,7 +737,7 @@
         else:
             mathjax = ""
         
-        if Preferences.getEditor("PreviewMarkdownMermaid"):
+        if mermaidNeeded:
             mermaid = (
                 "<script type='text/javascript' id='Mermaid-script'"
                 " src='https://unpkg.com/mermaid@8/dist/mermaid.min.js'>\n"
@@ -836,9 +772,16 @@
             '''content="text/html; charset=utf-8" />\n'''
             '''{0}'''
             '''{1}'''
+            '''<style type="text/css">'''
+            '''{2}'''
+            '''</style>\n'''
             '''</head>\n'''
             '''<body>\n'''
-        ).format(mathjax, mermaid)
+        ).format(
+            mathjax, mermaid,
+            PreviewerHTMLStyles.css_markdown +
+            PreviewerHTMLStyles.css_pygments
+        )
         
         foot = '''\n</body>\n</html>\n'''
         
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/UI/Previewers/PreviewerHTMLStyles.py	Fri Oct 25 20:15:51 2019 +0200
@@ -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 }
+
+"""

eric ide

mercurial