A WYSIWYG editor for DokuWiki
All documentation for this plugin can be found at https://www.dokuwiki.org/plugin:prosemirror
If you install this plugin manually, make sure it is installed in
lib/plugins/prosemirror/ - if the folder is called different it
will not work!
Please refer to http://www.dokuwiki.org/plugins for additional info on how to install plugins in DokuWiki.
Use yarn to install the dependecies
yarn
Create a develoment bundle:
yarn dev
Automatically recreate the bundle during development:
yarn watch
Build a release
yarn build
We really recommend yarn, but npm should work, too.
action/editor.php:HTML_EDITFORM_OUTPUTget Instructions and render them to json- see 
renderer.php renderer.phpuses the classesNodeStackNodeandMarkinschemato do its job- this should possibly renamed
 
- to keep information about a Node in as few places as possible,
some rendering instructions have been moved to the respective 
parser/classes 
- see 
 - Prosemirror parses that json in 
script/main.jsaccording to the schema defined inscript/schema.jsand creates itsdoc-Node from it. 
- Some Nodes (e.g. images, links) need to be resolved by DokuWiki in order to be rendered properly.
 - So ProseMirror makes ajax requests
- triggered by 
LinkForm.resolveSubmittedLinkDatainscript/LinkForm.js 
 - triggered by 
 - the request is handled by 
action/ajax.phpwhich resolves the link/images and returns the resolved html to be rendered into Prosemirror 
- Prosemirror synchronizes all changes with the underlying json in the 
<input>field - When the Editform is submitted that data has to be parsed by DokuWiki into DokuWiki-Syntax.
 - This starts in 
action/parser.phpduring the eventACTION_ACT_PREPROCESS- The main challenge is that Prosemirror operates on a flat array, whereas DokuWiki-Syntax is usually a tree
 - This means that the Syntax 
**bold __underlined and bold__**is represented in Prosemirror's data as[{text: "bold ", marks: [bold]}, {text: "underlined and bold", marks: [bold, underlined]}] - The creation of that syntax tree is started in 
parser/SyntaxTreeBuilder.php - Handling marks is complex and subtle:
- To know in which order we have to open/close marks we need to know which start earlier or end later
 - for this purpose, 
InlineNodeInterface::getStartingNodeMarkScore($markType)andMark::tailLengthplay together - for 
getStartingNodeMarkScore()to work, it needs the inline nodes inside a block node to be chained together, so we can ask the previous node whether it has a given node or not - If the marks on a node have the same start/end than they need a stable order in which they appear.
That is defined in 
Mark::markOrder 
 
 
Currently all our prosemirror scripts are in script/.
This definietly needs some better organisation.
I can see the following possible groups:
- NodeViews and Forms
- if a Node cannot be simply rendered and edited by ProseMirror, it needs a NodeView
 - Examples are links, images, footnotes(NodeView not yet implemented)
 - possibly also 
<code>and<file>? 
 - Menu-Related classes and menu items
 - keyboard commands
 - possibly 
commandsin general wich then can be used by menu-items and keyboard-events? - the schema
 
These files are compiled with webpack and transpiled with Babel into lib/bundle.js,
which is the file actually included by DokuWiki.
The central test-data is the collection of DokuWiki-Syntax and corresponding Prosemirror JSON
in _test/json/. This data is used for three sets of tests:
- Testing the rendering of DokuWiki-Syntax to Prosemirror JSON in 
_test/renderer.test.php - Testing the parsing of Prosemirror JSON back to the original DokuWiki-Syntax in 
_test/jsonParser.test.php - Testing the validity of the Prosemirror JSON against the schema (
script/schema.js) in_jstest/test.js 
The rendering and parsing tests are run as usual DokuWiki tests.
The javascript tests are run with yarn test
The scripts in script/ are also checked when building with eslint.
Eslint can also be run on its own with yarn eslint.
Copyright (C) CosmoCode GmbH dokuwiki@cosmocode.de Andreas Gohr Michael Grosse Anna Dabrowska
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
See the COPYING file in your DokuWiki folder for details
