Coder Social home page Coder Social logo

grosenberg / fluentmark Goto Github PK

View Code? Open in Web Editor NEW
36.0 5.0 13.0 18.15 MB

FluentMark -- Eclipse editor for Markdown content

License: Eclipse Public License 1.0

CSS 1.10% Java 9.05% HTML 0.01% ANTLR 0.17% SCSS 89.35% Sass 0.04% Batchfile 0.02% JavaScript 0.01% Vue 0.12% TypeScript 0.15%
markdown eclipse-plugin latex pandoc-converter dot-graphics eclipse-ide blackfriday-converter

fluentmark's Introduction

Logo

FluentMark

A full-featured Markdown editing environment for Eclipse.

Features

  • Standard Markdown syntax

  • Extended syntax

    • Html - inline & block
    • Math - inline & block
    • Latex - inline & block
    • Graphs - Graphviz Dot language block
    • Uml - PlantUml language block
  • Liveview - real-time external browser rendered preview

  • Spell check with quick-assist correction processor

  • Smart editing behaviors, including intelligent paragraph, list & blank line handling+ Table editor

  • Text, list and table formatter

  • Optional stylesheet controlled editor presentation

  • Outline view with drag-and-drop support

Use

Main toolbar

toolbar

  1. Mark Occurrences
  2. Feature Toolbar
  3. Soft Line Wrap
  4. Show Whitespace Characters
  5. Live View
  6. Export to HTML
  7. Export to PDF

Details on how to use Fluentmark.

Details on the Semantic Styling feature.

Screenshot

screen shot

Graph presentation using Graphviz Dot

Installation

Installation:

Certiv Tools update site: https://www.certiv.net/updates

Requirements

  • Eclipse 2021-03
  • JDK 11+
  • Graphviz for Dot and PlantUml language blocks
  • Pandoc and a LaTeX processor (like MikTeX) for Html and Pdf export

Configuration

Eclipse Preference pages ---

Window -> Certiv Tools -> FluentMark

To use the Pandoc converter, select the pandoc executable from the local filesystem on the Pandoc Converter tab.

To use Graphviz Dot, select the dot executable on the Fluentmark preference page. Note, if Graphviz is installed in a non-default directory, PlantUML requres that the GRAPHVIZ_DOT environment variable be set to the actual installation directory.

To use the BlackFriday converter, install the customized blackfriday-tool from GitHub. A Windows 64-bit compiled executable is available for download blackfriday-tool.zip. The blackfriday-tool executable can then be selected on the BlackFriday Converter tab.

Support

Open an issue on Github. Provide as much information as possible:

  • a minimal Markdown document that demonstrates the issue(s)
  • the error message(s) encountered
  • OS, Eclipse and JDK versions

Resources

  1. Markdown Syntax
  2. TeX Syntax Documentation
  3. PlantUML Language Specification
  4. Graphviz Documentation

License

EPL

fluentmark's People

Contributors

grosenberg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

fluentmark's Issues

User documentation missing

After installing Fluentmark using the Eclipse Marketplace there is no user documentation on how to use it.

Opening a .md file will edit it using the "FluentMark Editor" but no "FluentMark View" to preview it.
The editor shows no toolbar inside the editor for any markup and the user is not informed about the few keyboard shortcuts mentions in the README.md here on GitHub.
The 3 new toolbar items are easy to miss in the large toolbar on modern high resolution and high DPI screens.
There are also no entries in the context menu inside the editor or on .md files .

There should be hints and helpful, visible tools inside the editor to make it usable for first time users.

Add more supported LaTeX equation formats

Describe your feature request

Many scientific texts contain equations. Currently texts are sometimes written in RMarkdown.

Some texts are books and articles written in bookdown, some of texts are presentations written with xaringan.

What problem does this feature solve?

Support many LaTeX equation notations such as:

Inline equation $f(x) = \sin(x)$

---

Environment `\begin{equation}...(\#eq:label)\end{equation}`
with auto-numbering and label (for bookdown):

\begin{equation}
  f\left(k\right) = \binom{n}{k} p^k\left(1-p\right)^{n-k}
  (\#eq:binom)
\end{equation}

---

Environment `\begin{equation}...\label{label}\end{equation}`
with auto-numbering label for xaringan

\begin{equation}
  g\left(k\right) = \binom{n}{k} p^k\left(1-p\right)^{n-k}
\label{binom2}
\end{equation}

Currently the rendering fails:

fluentmark-math

Additional context

This functionality is currently supported in VNote and ReText:

retext-math

In this feature request I ask only for rendering of equations.
Auto-numbering is not needed for me.
I'll do it in RStudio after knitting of the document.

Problem with GUI controls on Converters preferences page

  1. When a checkbox is clicked then the whole panel is set to a disabled state.
  2. When user types in a text field and that results in a validation error, the text field loses focus.

FluentMark version: 0.9.1.20170130-0509
Eclipse version: Neon.2 Release (4.6.2) Build id: 20161208-0600
OS: Windows 10

Tables don't display

Tables do not display in the viewer. The raw pipe characters are displayed instead.

To reproduce simply make a table and view in the viewer.

Synchronized vertical scroll

This is a suggestion for an enhancement that could solve one of the problems I encounter. I haven't found yet a means to have the FluentMark view vertically synchronized with the active editor.

For short documents, it's no big deal to manually scroll the rendering view in order to see how the text being edited is rendered. But it gets a bit more cumbersome for long documents. So I thought of solutions that could alleviate this issue.

Solution 1 would replicate the behavior of the WikiText editor: the Link with Editor button would affect both the editor and the view. But this feels weird here because the view is not embedded as a tab within the editor like it is with WikiText. Moreover, I wonder how the Outline view would know which of the editor or view to target.

Solution 2 would be to synchronize the view with the current editor à la Notepad++'s Synchronize Vertical Scrolling, using a new button in the toolbar of the view, maybe between the buttons for refreshing the view and the button for opening stylesheet preferences. That way, the view will scroll when the editor is scrolled, but not the other way around: scrolling the view will not affect the editor.

Just a suggestion, I don't know how technically feasible it would be!

0.12.0.20170721-0031: space key ignored

I just upgraded my Eclipse installation (20170314-1500) and FluentMark was updated from 0.9 (if I'm right) to 0.12.0.20170721-0031. Since then, FluentMark refuses to enter any space in the edited file... Is there something trivial that I made wrong?

Not installable while using LiClipse Feature 4.3.0

Seems it gives a dependency error on eclipse.spellchecker.

Liclipse -> 4.3.0.201711051152
FluentMark -> 3.3.0.20161216-0034

the only option is to uninstall LiClipse Feature?

details below:

Cannot complete the install because of a conflicting dependency.
Software being installed: FluentMark Editor 0.15.0.20171223-2156 (net.certiv.fluentmark.feature.feature.group 0.15.0.20171223-2156)
Software currently installed: LiClipse Feature 4.3.0.201711051152 (com.brainwy.liclipse.feature.feature.group 4.3.0.201711051152)
Only one of the following can be installed at once:
Spellchecker 4.4.0.201711281546 (eclipse.spellchecker 4.4.0.201711281546)
Spellchecker 4.3.0.201711051152 (eclipse.spellchecker 4.3.0.201711051152)
Spellchecker 3.3.0.20161216-0034 (eclipse.spellchecker 3.3.0.20161216-0034)
Cannot satisfy dependency:
From: LiClipse Feature 4.3.0.201711051152 (com.brainwy.liclipse.feature.feature.group 4.3.0.201711051152)
To: eclipse.spellchecker [4.3.0.201711051152]
Cannot satisfy dependency:
From: Spellchecker 3.3.0.20161216-0034 (eclipse.spellchecker.feature.feature.group 3.3.0.20161216-0034)
To: eclipse.spellchecker [3.3.0.20161216-0034]
Cannot satisfy dependency:
From: FluentMark Editor 0.15.0.20171223-2156 (net.certiv.fluentmark.feature.feature.group 0.15.0.20171223-2156)
To: eclipse.spellchecker.feature.feature.group [3.3.0.20161216-0034]

Option for limiting the Outline to headings

This request could also be phrased as "setting for not showing paragraphs in the Outline view", but my request would include lists and tables as well. Actually, anything that is not a heading would be absent from the Outline (if this hypothetical setting is enabled).

Was it possible to move FluentMark View into FluentMark Editor?

I open several Markdown editors, but if I close one of the editors, the FluentMark View close automatically, so I must open FluentMark View again.

I think it would be better to remove the FluentMark View and provide a preview panel inside Markdown editor.

Dependency on specific bundle minor versions

I had some trouble when I tried to installed FluentMark because it declares a dependency on the version 3.12.2 of bundle org.eclipse.jdt.ui.

I believe that it would be more appropriate to declare a dependency on version 3.0.0 or version 3.12.0 or something like that.

The same goes for other dependencies.

See http://wiki.eclipse.org/Version_Numbering.

The error message I was confronted with was the following:

Cannot complete the install because of a conflicting dependency.
  Software being installed: FluentMark Editor 0.9.1.20170130-0509 (net.certiv.fluentmark.feature.feature.group 0.9.1.20170130-0509)
  Software currently installed: Eclipse Java Development Tools 3.12.0.v20160606-1100 (org.eclipse.jdt.feature.group 3.12.0.v20160606-1100)
  Only one of the following can be installed at once: 
    Java Development Tools UI 3.12.1.v20160822-0645 (org.eclipse.jdt.ui 3.12.1.v20160822-0645)
    Java Development Tools UI 3.12.0.v20160525-1829 (org.eclipse.jdt.ui 3.12.0.v20160525-1829)
    Java Development Tools UI 3.12.2.v20160929-0804 (org.eclipse.jdt.ui 3.12.2.v20160929-0804)
  Cannot satisfy dependency:
    From: FluentMark Editor 0.9.1.20170130-0509 (net.certiv.fluentmark 0.9.1.20170130-0509)
    To: bundle org.eclipse.jdt.ui 3.12.2
  Cannot satisfy dependency:
    From: FluentMark Editor 0.9.1.20170130-0509 (net.certiv.fluentmark.feature.feature.group 0.9.1.20170130-0509)
    To: net.certiv.fluentmark [0.9.1.20170130-0509]
  Cannot satisfy dependency:
    From: Eclipse Java Development Tools 3.12.0.v20160606-1100 (org.eclipse.jdt.feature.group 3.12.0.v20160606-1100)
    To: org.eclipse.jdt.ui [3.12.0.v20160525-1829]

PS: When I come to think of it, it's a bit weird that a Markdown plug-in has a dependency on JDT.

FluentMark version: 0.9.1.20170130-0509
Eclipse version: Neon.2 Release (4.6.2) Build id: 20161208-0600
OS: Windows 10

Setting for a different font configuration for code

I'd to like to suggest this as an enhancement: there could be an option to specifically format inline code and code blocks with more than just texte styling (bold, italic, underline, etc.). I mean, in the editor, not in the FluentMark view.

The setting could have its own font entry in a FluentMark group of General > Appearance > Colors and Fonts (instead of being in Certiv Tools > FluentMark > Appearance like other styling options).

Rendering MD-File from (E)Git-History causes ClassCastException

Hi,
thanks for this cool plugin! :-)
But sadly we have a tiny problem.

We are using the following:
Eclipse SDK
Version: Oxygen.2 (4.7.2)
Build id: M20171130-0510
and these relevant Plugins:

  • FluentMark Editor: 0.20.0.20180215-2100
  • Eclipse EGit: 4.9.2.201712150930-r

When we open a readme file inside the worspace and view it in the FluentMark View everything works like expected.
Then we open the corresponding "History view" and open an old version of this readme file from our Git repo. This still works. But if we then open/show the FluentMark View, we will always get the error below:

!ENTRY org.eclipse.core.jobs 4 2 2018-02-16 09:57:50.888
!MESSAGE An internal error occurred during: "Update".
!STACK 0
java.lang.ClassCastException: org.eclipse.egit.ui.internal.revision.FileRevisionEditorInput cannot be cast to org.eclipse.ui.IPathEditorInput
	at net.certiv.fluentmark.editor.FluentMkEditor.getHtml(FluentMkEditor.java:573)
	at net.certiv.fluentmark.views.UpdateJob.run(UpdateJob.java:70)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)

Formating a file (ctrl+shift+f) truncate last character of lines

When formating files in Eclipse (shortcut ctrl+shift+f), last character of lines are truncate.

To reproduce, insert the following text in a md file and it ctrl+shift+f :

### Test

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Open webpage in internal web browser

If I'm editing a markdown document that contains a hyperlink and then click on that link in the fluentmark viewer, the webpage is opened in the fluentmark viewer. It should be opened in the eclipse internal web browser instead.

Errors if opening a MD file containing a front-matter section

When opening a file containing a Jekyll front-matter section or if adding such a section to an open file, this results in the following error:

An error has occurred. See error log for more details.
net.certiv.fluentmark.model.PageRoot cannot be cast to net.certiv.fluentmark.model.PagePart

Error when open a MD file or when try to access to plugin's properties

I get an error from editor when try to open a MD file. Also if try to access to plugin's properties.

The fluentmark plugin was installed from marketplace.

The environment
Spring Tool Suite
Version: 3.8.4.RELEASE
Build Id: 201703310825
Platform: Eclipse Neon.3 (4.6.3)

FluentMark plugin: FluentMark Editor 0.10.0.20170406-2235 net.certiv.fluentmark.feature.feature.group Certiv Analytics

Session Data:
eclipse.buildId=3.8.4.201703310825-RELEASE-e46
java.version=1.8.0_121
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=ca_ES
Framework arguments: -product org.springsource.sts.ide
Command-line arguments: -data file:/home/octavi/desenvolupament/albirar.cat/projectes/industria/workspace/industria/ -os linux -ws gtk -arch x86_64 -product org.springsource.sts.ide -clean

This is a continuation of log file /home/octavi/desenvolupament/albirar.cat/projectes/industria/workspace/industria/.metadata/.bak_0.log
Created Time: 2017-04-10 18:50:07.288

The stacktrace when try to open the file
org.eclipse.core.runtime.CoreException: Plug-in net.certiv.fluentmark was unable to load class net.certiv.fluentmark.editor.FluentMkEditor.
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176)
at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286)
at org.eclipse.ui.internal.registry.EditorDescriptor.createEditor(EditorDescriptor.java:235)
at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:329)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPart(CompatibilityPart.java:278)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor.createPart(CompatibilityEditor.java:63)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:316)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:966)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:931)
at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:151)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:375)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:294)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:105)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:74)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:56)
at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:975)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:651)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:757)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:728)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:722)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:706)
at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1324)
at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer$1.handleEvent(LazyStackRenderer.java:72)
at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:145)
at org.eclipse.swt.widgets.Display.syncExec(Display.java:5414)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:211)
at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36)
at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:94)
at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:173)
at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:617)
at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:581)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:770)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:401)
at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1214)
at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3261)
at org.eclipse.ui.internal.WorkbenchPage.access$25(WorkbenchPage.java:3176)
at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:3158)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3153)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3117)
at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3107)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:563)
at org.eclipse.ui.ide.IDE.openEditor(IDE.java:518)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:360)
at org.eclipse.jdt.internal.ui.javaeditor.EditorUtility.openInEditor(EditorUtility.java:167)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:256)
at org.eclipse.jdt.ui.actions.OpenAction.run(OpenAction.java:221)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.dispatchRun(SelectionDispatchAction.java:271)
at org.eclipse.jdt.ui.actions.SelectionDispatchAction.run(SelectionDispatchAction.java:249)
at org.eclipse.jdt.internal.ui.navigator.OpenAndExpand.run(OpenAndExpand.java:50)
at org.eclipse.ui.actions.RetargetAction.run(RetargetAction.java:225)
at org.eclipse.ui.navigator.CommonNavigatorManager$2.open(CommonNavigatorManager.java:191)
at org.eclipse.ui.OpenAndLinkWithEditorHelper$InternalListener.open(OpenAndLinkWithEditorHelper.java:46)
at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:855)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173)
at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:852)
at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1169)
at org.eclipse.ui.navigator.CommonViewer.handleOpen(CommonViewer.java:451)
at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:278)
at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:272)
at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:313)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5227)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1340)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4561)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4151)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
at org.eclipse.equinox.launcher.Main.main(Main.java:1492)
Caused by: java.lang.ClassNotFoundException: net.certiv.fluentmark.editor.FluentMkEditor cannot be found by net.certiv.fluentmark_0.10.0.20170406-2235
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174)
... 114 more

The stacktrace when try to access to plugin's properties:
Unable to create the selected preference page.
java.lang.ClassNotFoundException: net.certiv.fluentmark.preferences.pages.PrefPageEditor cannot be found by net.certiv.fluentmark_0.10.0.20170406-2235
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:461)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364)
at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174)
at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286)
at org.eclipse.ui.internal.dialogs.WorkbenchPreferenceNode.createPage(WorkbenchPreferenceNode.java:48)
at org.eclipse.jface.preference.PreferenceDialog.createPage(PreferenceDialog.java:1280)
at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.createPage(FilteredPreferenceDialog.java:355)
at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1167)
at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:608)
at org.eclipse.jface.preference.PreferenceDialog$5.lambda$0(PreferenceDialog.java:656)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.jface.preference.PreferenceDialog$5.selectionChanged(PreferenceDialog.java:653)
at org.eclipse.jface.viewers.StructuredViewer$3.run(StructuredViewer.java:878)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50)
at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173)
at org.eclipse.jface.viewers.StructuredViewer.firePostSelectionChanged(StructuredViewer.java:875)
at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1729)
at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1077)
at org.eclipse.jface.preference.PreferenceDialog.selectSavedItem(PreferenceDialog.java:991)
at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.selectSavedItem(FilteredPreferenceDialog.java:656)
at org.eclipse.jface.preference.PreferenceDialog.lambda$0(PreferenceDialog.java:346)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at org.eclipse.jface.preference.PreferenceDialog.createContents(PreferenceDialog.java:343)
at org.eclipse.jface.window.Window.create(Window.java:426)
at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1095)
at org.eclipse.ui.internal.dialogs.WorkbenchPreferenceDialog.createDialogOn(WorkbenchPreferenceDialog.java:102)
at org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(PreferencesUtil.java:192)
at org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(PreferencesUtil.java:116)
at org.eclipse.ui.internal.OpenPreferencesAction.run(OpenPreferencesAction.java:62)
at org.eclipse.jface.action.Action.runWithEvent(Action.java:473)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565)
at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5227)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1340)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4561)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4151)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
at org.eclipse.equinox.launcher.Main.main(Main.java:1492)

Unable to activate PlantUML support

I have installed the latest versions of fluentmark (from http://www.certiv.net/updates) as well as pandoc.

Although support for PlantUML should be available, there are no preferences for this and the editor does not seem to recognise the starting and ending @startuml, @enduml tags (as in the tags are not recognised as keywords, there are no templates, and they are not syntax highlighted in any way). The view just displays the text verbatim without rending the expected image.

Dot works just fine.
I have chosen pandoc as converter thanks to #29.
My plantuml fragments can be recognised and rendered using plantuml directly.
I am using Windows and Eclipse DSL Tools, Version: 2019-12 (4.14.0)

java.lang.ClassCastException: net.certiv.fluentmark.model.PageRoot cannot be cast to net.certiv.fluentmark.model.PagePart

java.lang.ClassCastException: net.certiv.fluentmark.model.PageRoot cannot be cast to net.certiv.fluentmark.model.PagePart
	at net.certiv.fluentmark.model.PageRoot.addToParent(PageRoot.java:474)
	at net.certiv.fluentmark.model.PageRoot.parse(PageRoot.java:383)
	at net.certiv.fluentmark.model.PageRoot.updateModel(PageRoot.java:138)
	at net.certiv.fluentmark.editor.FluentMkEditor.updatePageModel(FluentMkEditor.java:521)
	at net.certiv.fluentmark.editor.FluentMkEditor.getPageModel(FluentMkEditor.java:504)
	at net.certiv.fluentmark.editor.FluentMkEditor.getPagePartAt(FluentMkEditor.java:816)
	at net.certiv.fluentmark.editor.FluentMkEditor.getMatchingPagePart(FluentMkEditor.java:800)
	at net.certiv.fluentmark.editor.FluentMkEditor.getShowInContext(FluentMkEditor.java:947)
	at org.eclipse.ui.internal.services.WorkbenchSourceProvider.getContext(WorkbenchSourceProvider.java:410)
	at org.eclipse.ui.internal.services.WorkbenchSourceProvider.updateActivePart(WorkbenchSourceProvider.java:476)
	at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:294)
	at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:289)
	at org.eclipse.ui.internal.services.WorkbenchSourceProvider$2.windowActivated(WorkbenchSourceProvider.java:248)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:1052)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.Workbench.fireWindowActivated(Workbench.java:1049)
	at org.eclipse.ui.internal.WorkbenchWindow$15.shellActivated(WorkbenchWindow.java:2314)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:89)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088)
	at org.eclipse.swt.widgets.Decorations.WM_ACTIVATE(Decorations.java:1698)
	at org.eclipse.swt.widgets.Shell.WM_ACTIVATE(Shell.java:2277)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4840)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359)
	at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1657)
	at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2199)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:5178)
	at org.eclipse.swt.internal.win32.OS.SetFocus(Native Method)
	at org.eclipse.swt.widgets.Control.forceFocus(Control.java:1114)
	at org.eclipse.swt.widgets.Control.setFocus(Control.java:3492)
	at org.eclipse.ui.internal.quickaccess.SearchField.checkFocusLost(SearchField.java:534)
	at org.eclipse.ui.internal.quickaccess.SearchField$4.lambda$0(SearchField.java:247)
	at org.eclipse.ui.internal.quickaccess.SearchField$4$$Lambda$367/1369338774.run(Unknown Source)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:37)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4213)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3820)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
	at org.eclipse.ui.internal.Workbench$$Lambda$14/1772780918.run(Unknown Source)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:151)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1499)

image

image

FluentMark 1.0.0 renders Eclispe Photon unusable

I am unable to use to use Eclipse Photon, it is stuck in an exception loop that launches this dialogue:

Loop exception

This dialogue reappears immediately after being closed, making it impossible to use Eclipse. The exception reporter is presenting the following stack trace:

Exception:java.lang.ClassCastException: net.certiv.fluentmark.model.PageRoot cannot be cast to net.certiv.fluentmark.model.PagePart at net.certiv.fluentmark.model.PageRoot.addToParent(PageRoot.java:501) at net.certiv.fluentmark.model.PageRoot.parse(PageRoot.java:410) at net.certiv.fluentmark.model.PageRoot.updateModel(PageRoot.java:138) at net.certiv.fluentmark.editor.FluentMkEditor.updatePageModel(FluentMkEditor.java:522) at net.certiv.fluentmark.editor.FluentMkEditor.getPageModel(FluentMkEditor.java:505) at net.certiv.fluentmark.editor.FluentMkEditor.getPagePartAt(FluentMkEditor.java:681) at net.certiv.fluentmark.editor.FluentMkEditor.getMatchingPagePart(FluentMkEditor.java:665) at net.certiv.fluentmark.editor.FluentMkEditor.getShowInContext(FluentMkEditor.java:822) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.getContext(WorkbenchSourceProvider.java:410) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.updateActivePart(WorkbenchSourceProvider.java:476) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:294) at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:289) at org.eclipse.ui.internal.services.WorkbenchSourceProvider$1.partOpened(WorkbenchSourceProvider.java:239) at org.eclipse.ui.internal.PartService$5.run(PartService.java:131) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.PartService.partOpened(PartService.java:128) at org.eclipse.ui.internal.WorkbenchPage$22.run(WorkbenchPage.java:5169) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.ui.internal.WorkbenchPage.firePartOpened(WorkbenchPage.java:5166) at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.lambda$1(CompatibilityPart.java:121) at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40) at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233) at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:144) at org.eclipse.swt.widgets.Display.syncExec(Display.java:5831) at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:212) at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36) at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201) at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:196) at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135) at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78) at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39) at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52) at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60) at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374) at org.eclipse.e4.ui.model.application.ui.basic.impl.PartImpl.setObject(PartImpl.java:435) at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:130) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:1012) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:672) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$1.run(PartRenderingEngine.java:557) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:541) at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.createWidget(ElementReferenceRenderer.java:70) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:1012) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:672) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:778) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:749) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:743) at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:727) at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$1.handleEvent(PartServiceImpl.java:109) at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40) at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233) at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:144) at org.eclipse.swt.widgets.Display.syncExec(Display.java:5831) at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:212) at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36) at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201) at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:196) at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1) at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135) at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78) at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39) at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52) at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60) at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374) at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:174) at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.lambda$3(StackRenderer.java:1043) at org.eclipse.swt.events.SelectionListener$1.widgetSelected(SelectionListener.java:81) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:249) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5686) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1370) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1396) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1379) at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1164) at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3195) at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1878) at org.eclipse.swt.custom.CTabFolder.lambda$0(CTabFolder.java:328) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5686) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1370) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4940) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4518) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1170) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1059) at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153) at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:667) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:597) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:656) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:592) at org.eclipse.equinox.launcher.Main.run(Main.java:1498) at org.eclipse.equinox.launcher.Main.main(Main.java:1471)

This issue was originally reported at Bugzilla, but folks there refused responsibility.

Shortcuts/keybindings when editing Markdown.

Many markdown editors support shortcuts/keybindings to do some useful things.
Example:
Ctrl+B = make things bold, by surrounding marked with ** **
Ctrl+I = make things italic, by surrounding marked with _ _

I find these shortcuts are extremely useful when editing markdown and they are supported it THIS editor I'm typing right now,
Its also supported by the other tools like the forum Discourse which also uses markdown.

Pandoc HTML text encoding issues

  1. Weird characters, for example å, ä and ö are not handled properly. A opening a FluentMark editor on a file with these characters makes the FluentMark view display the following message:
pandoc.exe: Cannot decode byte '\xf6': Data.Text.Internal.Encoding.Fusion.streamUtf8: Invalid UTF-8 stream

This seems to happens regardless of what text encoding scheme the file is configured to have in Eclipse.

  1. When the Converters -> Pandoc Options -> Use Stmart Typography settings is enabled, then the ' character is rendered as ’ in the FluentMark view.

(The FluentMark editor doesn't exhibit any of these problems.)

FluentMark version: 0.9.1.20170130-0509
Eclipse version: Neon.2 Release (4.6.2) Build id: 20161208-0600
OS: Windows 10

Enable PlantUML rendering for TxtMark

I'm using FluentMark 1.2.0.20180807-2118 on Eclipse Photon 4.8.0 (Windows).

By default PlantUML rendering is disabled and TxtMark is set as converter.
The issue is: PlantUML rendering can only be activated for TxtMark by selecting the Pandoc converter (even if pandoc is not installed), checking the box "Enable PlantUML rendering", and switching back to the TxtMark converter.

I would have expected this checkbox to be in each converter that supports it.

Nice plugin by the way.

Avoid autoscrolling when text being edited is in view

The editor window autoscrolls unnecessarily because it tries to ensure that the selected outline header is in the editor window. This causes the document to autoscroll back and forth while the user is editing the document.

  1. Open markdown text editor with outline available.
  2. Create document with ~3 level-1 headers, each containing a list with 20 items.
  3. Shrink window to ~15 lines, not showing either header
  4. Type to edit an entry. (If necessary, do return plus - to start a new item)
    RESULT: document autoscrolls confusingly, leaving the entry cursor outside visible window
  5. Continue typing (or just be typing fast)
    RESULT: document autoscrolls to header, then to typed text, then to header....

Note: this happens whether the outline is in follow mode or not (though it may be worse in follow mode).

Possible solutions?:

  1. Minimally instead if the cursor is in the range before the next document header, then the editor window should not be scrolled.
  2. But generally it seems the outline should not scroll the document unless the user is actively entering text in the outline.
    • In follow mode, the outline should select the header of the text as the user's cursor moves through the document, but when the user's document change causes a header change, that shouldn't scroll the document (and it won't if the header change does not move the document window when the cursor is under the header and visible).

An internal error occurred during: "Update" when showing FluentMark view

Unfortunately, I can't get FluentMark to work at all: When creating a md file, any letter I write will cause the above error (details show just NullPointerException without a backtrace).

OS: Ubuntu 16.04
Eclipse version: neon.3
FluentMark version: 0.10.0.20170410-1718

I have pandadoc and graphviz installed, not sure if there is other requirements as well.

Anyway, thanks for writing this tool!

Certificate problem with update site http://www.certiv.net/updates/

I'm unable to install the fluentmark editor from Eclipse marketplace due to a certificate error when trying to connect to http://www.certiv.net/updates/. It looks like the URL is redirecting to https://www.certiv.net/updates/ and the certificate served dose not include https://www.certiv.net in the subjectAltName. The current workaround is to manually use https://certiv.net/updates/.

The issue is easy to replicate using: curl -L -v http://www.certiv.net/updates/

Wrap pasted text

It'd be nice if FluentMark editor would wrap a text pasted in a MD document. Currently, only the text directly entered (from the keyboard) is wrapped.

Ctrl-Shift-F does not work

In fact this is a follow-up for #8 that I cannot reopen... I cannot manage to get Ctrl-Shift-F to work, not sure why... I'd the feeling it worked once on the whole text (with the result of messing it up). My last comment in #8 (#8 (comment)) still applies...

Error Dialog on a bad dot grammar usage.

Hello,

Recently added this to eclipse through the marketplace.
This is the detail error of the dialog that pops up and cannot be closed until you close the editor.

An error has occurred. See error log for more details.
net.certiv.fluentmark.model.PageRoot cannot be cast to net.certiv.fluentmark.model.PagePart

I was trying to use a dot example (without the ~~~ dot)

graph {
    a -- b;
    b -- c;
    a -- c;
    d -- c;
    e -- c;
    e -- a;
}

p.s. I hadn't done this ->To use DOT, install Graphviz. Then, in the FluentMark Converter preferences for DOT, browse to and select the dot executable.

Limited content assist?

From what I understand the only content assist available is for section headers and code blocks?

Remove support for legacy converters.

Proposal is to remove support for the CommonMark, MarkdownJ, Pegdown & TxtMark converters from Fluentmark.

Pandoc is the currently preferred markdown converter. Pandoc is actively developed & supported. Not clear if the other converters are as widely used.

If there are reasons to retain any of the legacy converters, please explain in a comment.

Support for PlantUML sections

It would be good if PlantUML text could be handled in the same way as Graphviz dot sections. I.e., identifying sections such as

@startuml
interface FileParser
interface Engine

class Configuration
class Collector
class Reporter
class Filter

PtraceEngine -up-|> Engine
BashEngine -up-|> Engine

BashEngine -down-|> FileParser

ElfParser -up-|> FileParser

Collector -- Engine : Sets/collects breakpoints
Collector -- FileParser : Receives file/line/address
Collector -- Reporter : Recieves executed lines

Reporter -- Writer : Reports executed lines
@enduml

and running invoking the Eclipse PlantUML plugin to produce a PNG output.

Images doesn't show in preview

I'm trying to insert an image in my documentation. The path is correct and the declaration too (in the generated doc the image shows correctly). But in the preview I got an empty picture just like if the file was not found.

To reproduce, insert an image like this :

#### TestImage
[![My image](images/myImage.png)](images/myImage.png)

I'm using Pandoc converter but it seems the same with all others.

Decoding error in the view when using PanDoc

On Windows, using the PanDoc converter, I get the error message
UTF-8 decoding error in - at byte offset 12374 (ab). The input must be a UTF-8 encoded text.
in the FluentMark View if using non-ascii characters (e.g. æ, ø, å, ô) even though the file in the editor is UTF-8 encoded.

This also happens if i just insert two consecutive greater than characters ">>", which is preventing the preview from displaying PlantUML diagrams containing stereotypes.

I think the problem is that the content of the editor is written to the PanDoc converter in the default (platform specific) encoding. I took a look at the code in the master branch and if I have understood it right, the file is written to PanDoc in net.certiv.fluentmark.util.Cmd.process():

	OutputStreamWriter out = new OutputStreamWriter(process.getOutputStream());

This constructor of OutputStreamWriter uses the platform specific encoding, so based on this stackoverflow comment I think it should probably be changed to something like:

	OutputStreamWriter out = new OutputStreamWriter(process.getOutputStream(), Charset.forName("UTF-8").newEncoder());

to explicitly set the output encoding to UTF-8, at least when the converter is PanDoc. Perhaps it should be parametrized if UTF-8 is not the right choice for all converters. I think this will even make it work if the file is written in a completely different encoding, as long as eclipse is aware of the correct encoding of the source file.

I have not figured out how to setup the project so I can test it, so I have not tried out this solution. But if I add: -Dfile.encoding=UTF-8 argument to eclipse to make UTF-8 the default encoding, it displays fine without any conversion errors, with the exact same file, which I think confirms that this solution should work.

FluentMark causing Eclipse to crash

I have been using FluentMark successfully in the last months but starting yesterday, editing a file (probably with an incorrect MD content), I started to get NullPointer exceptions and trying to restart Eclipse, I found it crashing everytime. The only workaround I found was to uninstal FluentMark from another workspace.

The workspace log is:

!ENTRY org.eclipse.text 4 2 2017-03-22 22:04:14.414
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.text".
!STACK 0
java.lang.NullPointerException
	at net.certiv.fluentmark.model.PageRoot.addToParent(PageRoot.java:451)
	at net.certiv.fluentmark.model.PageRoot.parse(PageRoot.java:359)
	at net.certiv.fluentmark.model.PageRoot.updateModel(PageRoot.java:139)
	at net.certiv.fluentmark.model.PageRoot.documentChanged(PageRoot.java:86)
	at net.certiv.fluentmark.editor.FluentMkEditor.fireDocumentChanged(FluentMkEditor.java:962)
	at net.certiv.fluentmark.editor.FluentMkEditor$1.documentChanged(FluentMkEditor.java:186)
	at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged2(AbstractDocument.java:743)
	at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged(AbstractDocument.java:712)
	at org.eclipse.jface.text.AbstractDocument.doFireDocumentChanged(AbstractDocument.java:696)
	at org.eclipse.jface.text.AbstractDocument.fireDocumentChanged(AbstractDocument.java:770)
	at org.eclipse.jface.text.AbstractDocument.replace(AbstractDocument.java:1101)
	at org.eclipse.core.internal.filebuffers.SynchronizableDocument.replace(SynchronizableDocument.java:173)
	at org.eclipse.jface.text.AbstractDocument.replace(AbstractDocument.java:1119)
	at org.eclipse.core.internal.filebuffers.SynchronizableDocument.replace(SynchronizableDocument.java:161)
	at org.eclipse.jface.text.DefaultDocumentAdapter.replaceTextRange(DefaultDocumentAdapter.java:233)
	at org.eclipse.swt.custom.StyledText.modifyContent(StyledText.java:7374)
	at org.eclipse.swt.custom.StyledText.sendKeyEvent(StyledText.java:8225)
	at org.eclipse.swt.custom.StyledText.doContent(StyledText.java:2530)
	at org.eclipse.swt.custom.StyledText.handleKey(StyledText.java:6018)
	at org.eclipse.swt.custom.StyledText.handleKeyDown(StyledText.java:6049)
	at org.eclipse.swt.custom.StyledText$7.handleEvent(StyledText.java:5733)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4418)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1103)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1088)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1130)
	at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1126)
	at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1547)
	at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4918)
	at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:364)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4799)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:359)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:5110)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2552)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3822)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1519)

I attach the file causing FluentMark to crash: coding_style.md

Not all colors configurable - difficult for dark theme users

I tried to setup colors for dark theme more readable. And changed all entries, but there are some which cannot be changed, see next picture:

image

So please add the missing ones.

Plugin version: 1.2.0.20180807-2118, loaded from eclipse marketplace

Remark:
In my own plugins I provide always a "Defaults for dark theme" button and sometimes also a dark.css file. Would be nice ...

Unix line endings changed to Windows line endings

When I open a file with Unix line ending those a immediately changed to windows line endings.

This changes the opened file, which becomes dirty (displaying a '*' symbol in the editor tab header in Eclipse). This is before any manually edits has been performed to the editor.

Feature request: (pluggable?) linter

I find myself constantly forgetting markdown idiosyncracies until I manually check the output. It would be nice to get squiggles e.g., when there are no extra lines before headlines or tables.

I realize that syntax varies significantly, so I wonder if this should be a pluggable thing.

I noticed a plugin that allows the user to configure a tool to generate problem markers: it could be a solution to recommend to users, to adapt, or to borrow ideas from: https://github.com/wrygiel/eclipse-external-problem-marker. It just runs the tool, snoops the stdout, and converts the results into problem markers. (It unfortunately assumes the file is on each line, while some tools put the file above the error line.)

(btw, I use pandoc for output along with my own customized templates. The fluentmark display window is great, but I'm invested in my reproducible document pipeline, and thus even being able to manually check that window isn't the best solution for me at least.)

Code block styling does not apply to indented code

At this moment (v1.2.0.20180807), the styling of code blocks only applies to fenced code, but not to indented code. This is true in the editor as well as in the Preview of Certiv Tool > FluentMark > Appearance.

I think it would be good if the styling of code blocks could also apply to indented code.

Cannot complete the install because one or more required items could not be found.

I have an environment that does not have general internet access, so I need to move files via the tried and true sneaker net. Anyway, I got the installation for Fluentmark and attempted to install it, but I got the following error:

Software being installed: FluentMark Editor 1.2.20180807-2118 
    (net.certiv.fluentmark.feature.feature.group 1.2.0.20180807-2118)
Missing requirement: Fluentmark Editor 1.2.0.20180807-2118 
    (net.certiv.fluentmark.feature.feature.group 1.2.0.20180807-2118) requires
"org.eclipse.equinox.p2.iu; org.eclipse.jdt.ui 0.0.0" could not be found`

What eclipse packages may I be missing?

Opening MD-File from (E)Git-History causes NullPointerException

@grosenberg first of all: A big thanks for your very quick response to Issue #25.
Sadly, after updating, now a new error occurs and thus the md file from history is now not at all viewable (only with a simple text editor).
I have updated this plugin from the update site (http://www.certiv.net/updates) to version 1.0.0.20180222-2348 (everything else, especially EGit, is up to date, see Issue #25).
Now I don't get the error in Issue #25 but a NPE. This error now occurs when I try to open the md file from the (Git) history view with the FluentMkEditor already. So now I get an error even earlier than before. With the old version I was at least able to open the md file with FluentMkEditor and could only not render it. Now opening and rendering don't work, well rendering might work, but I do not get this far, so I cannot tell.
Here is the long StackTrace:

java.lang.NullPointerException
	at net.certiv.fluentmark.editor.FluentMkEditor.doSetInput(FluentMkEditor.java:215)
	at org.eclipse.ui.texteditor.AbstractTextEditor$5.run(AbstractTextEditor.java:3154)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353)
	at org.eclipse.ui.internal.WorkbenchWindow$14.run(WorkbenchWindow.java:2195)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2191)
	at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3172)
	at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3197)
	at org.eclipse.ui.internal.EditorReference.initialize(EditorReference.java:362)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:333)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:990)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:955)
	at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:124)
	at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:399)
	at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:318)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:105)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:74)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:56)
	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:992)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:661)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:767)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:738)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:732)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:716)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$1.handleEvent(PartServiceImpl.java:104)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler$1.run(UIEventHandler.java:40)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:144)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:4889)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:212)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:36)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:52)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:173)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:620)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:584)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:769)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:401)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1188)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3261)
	at org.eclipse.ui.internal.WorkbenchPage.access$25(WorkbenchPage.java:3176)
	at org.eclipse.ui.internal.WorkbenchPage$10.run(WorkbenchPage.java:3158)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3153)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3117)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3107)
	at org.eclipse.egit.ui.internal.EgitUiEditorUtils.openEditor(EgitUiEditorUtils.java:121)
	at org.eclipse.egit.ui.internal.EgitUiEditorUtils.openEditor(EgitUiEditorUtils.java:107)
	at org.eclipse.egit.ui.internal.EgitUiEditorUtils.openEditor(EgitUiEditorUtils.java:72)
	at org.eclipse.egit.ui.internal.history.command.ShowVersionsHandler.execute(ShowVersionsHandler.java:101)
	at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:291)
	at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:92)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:305)
	at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:239)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
	at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:152)
	at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494)
	at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487)
	at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:210)
	at org.eclipse.ui.internal.handlers.LegacyHandlerService.executeCommandInContext(LegacyHandlerService.java:442)
	at org.eclipse.egit.ui.internal.history.CommitGraphTable$7.open(CommitGraphTable.java:309)
	at org.eclipse.jface.viewers.StructuredViewer$2.run(StructuredViewer.java:851)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.ui.internal.JFaceUtil.lambda$0(JFaceUtil.java:44)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173)
	at org.eclipse.jface.viewers.StructuredViewer.fireOpen(StructuredViewer.java:848)
	at org.eclipse.jface.viewers.StructuredViewer.handleOpen(StructuredViewer.java:1163)
	at org.eclipse.jface.util.OpenStrategy.fireOpenEvent(OpenStrategy.java:273)
	at org.eclipse.jface.util.OpenStrategy.access$2(OpenStrategy.java:268)
	at org.eclipse.jface.util.OpenStrategy$1.handleEvent(OpenStrategy.java:308)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:86)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4428)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4238)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3817)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1150)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1039)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:680)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:594)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:151)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:653)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:590)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1499)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1472)

Opening md-file from normally writable directory shows "Editor could not be initialized." in editor zone instead of document

I have installed Eclipse IDE and your great FluentMark plugin from Eclipse Market Place, then ensured that it is set as default Editor in File Association preferences.

But I'm having the with opening of Markdown files.

It exists on both 64-bit Windows 10 (clean fresh VM) -

Eclipse IDE for Java Developers
Version: 2020-03 (4.15.0)
Build id: 20200313-1211

with jdk-8u251-windows-x64.exe.

and Ubuntu 16.04.6 LTS -

Eclipse IDE for JavaScript and Web Developers
Version: 2020-03 (4.15.0)
Build id: 20200313-1211

 $ update-java-alternatives -l
 java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64

The Pandoc is installed on both systems if this matters.

The complete error text when I click Details button is the following:

java.lang.NullPointerException
	at net.certiv.fluentmark.editor.FluentMkEditor.doSetInput(FluentMkEditor.java:215)
	at org.eclipse.ui.texteditor.AbstractTextEditor.lambda$1(AbstractTextEditor.java:3179)
	at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:436)
	at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:352)
	at org.eclipse.ui.internal.WorkbenchWindow.lambda$5(WorkbenchWindow.java:2375)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72)
	at org.eclipse.ui.internal.WorkbenchWindow.run(WorkbenchWindow.java:2373)
	at org.eclipse.ui.texteditor.AbstractTextEditor.internalInit(AbstractTextEditor.java:3196)
	at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor.java:3221)
	at org.eclipse.ui.internal.EditorReference.initialize(EditorReference.java:353)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:340)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:1002)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:967)
	at org.eclipse.e4.core.internal.di.InjectorImpl.internalInject(InjectorImpl.java:139)
	at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:408)
	at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:331)
	at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:202)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:91)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:60)
	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:42)
	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:132)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:1002)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:662)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:768)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:739)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:733)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:717)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1297)
	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.lambda$0(LazyStackRenderer.java:75)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.lambda$0(UIEventHandler.java:38)
	at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:236)
	at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:133)
	at org.eclipse.swt.widgets.Display.syncExec(Display.java:5797)
	at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:219)
	at org.eclipse.e4.ui.services.internal.events.UIEventHandler.handleEvent(UIEventHandler.java:38)
	at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:205)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:203)
	at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
	at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:132)
	at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:75)
	at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:44)
	at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:55)
	at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:63)
	at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:424)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElementGen(ElementContainerImpl.java:170)
	at org.eclipse.e4.ui.model.application.ui.impl.ElementContainerImpl.setSelectedElement(ElementContainerImpl.java:188)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.showElementInWindow(ModelServiceImpl.java:661)
	at org.eclipse.e4.ui.internal.workbench.ModelServiceImpl.bringToTop(ModelServiceImpl.java:625)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.delegateBringToTop(PartServiceImpl.java:790)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.bringToTop(PartServiceImpl.java:404)
	at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.showPart(PartServiceImpl.java:1266)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:3195)
	at org.eclipse.ui.internal.WorkbenchPage.lambda$9(WorkbenchPage.java:3100)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:72)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3098)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3068)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:3051)
	at org.eclipse.ui.ide.IDE.openEditorOnFileStore(IDE.java:1376)
	at org.eclipse.ui.internal.ide.actions.OpenLocalFileAction.run(OpenLocalFileAction.java:100)
	at org.eclipse.ui.internal.ide.actions.OpenLocalFileAction.run(OpenLocalFileAction.java:73)
	at org.eclipse.ui.internal.PluginAction.runWithEvent(PluginAction.java:239)
	at org.eclipse.ui.internal.WWinPluginAction.runWithEvent(WWinPluginAction.java:218)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:579)
	at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:413)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5687)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1423)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4955)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4448)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:658)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:557)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:154)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1447)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1420)

What am I doing wrong? Is it a bug?

Large complex documents are slow to edit

(I realize this is vague, but I'm sure you're aware of the issue; this is mainly to ask if you have a solution in mind, and perhaps need help.)

I have many large markdown documents, and I find the editor to slow my typing and editing significantly. My guess is that typing, particularly changing structural elements like sublists and headers, causes the entire document to be reparsed because the underlying markdown parser does not support incremental updates/compilation.

If that's the problem and you have a solution (or know there isn't one), great.

(fwiw, I don't believe the problems is outliner/editor hysteresis from my last issue, since I get the slowness even when the outline view is not open.)

If the parser is already incremental and you think it depends on the document and there may be structure-specific or degenerate issues (e.g. with mis-formatting like no empty lines before the headers), then I can work to create some reproducible cases if that would help.

Comment command create TWO undo-actions

When the comment command is activated <!-- and --> is inserted around the selected text.

When the undo command is activated both of these should be removed by one undo action. But they are undo-ed separately, so it takes two undo:s to get rid of both of them.

FluentMark version: 0.9.1.20170130-0509
Eclipse version: Neon.2 Release (4.6.2) Build id: 20161208-0600
OS: Windows 10

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.