From 4396a87a8e7ff68deaac4d06da062da4f8c04b3d Mon Sep 17 00:00:00 2001
From: Giannis Kopanas <jkopanas@gmail.com>
Date: Sat, 21 Dec 2019 00:27:18 +0200
Subject: [PATCH] fix(schemaService); support array of parseRUles and style
 match of nodes marks

---
 editors/editoria/src/Editoria.js              |  2 +-
 wax-prosemirror-core/src/Wax.js               |  1 +
 wax-prosemirror-services/.gitignore           | 21 ++++++++++++++++
 .../src/SchemaService/Mark.js                 | 25 +++++++++++++------
 .../src/SchemaService/Node.js                 | 25 +++++++++++++------
 .../src/SchemaService/ParseRule.js            | 16 +++++++++---
 6 files changed, 70 insertions(+), 20 deletions(-)
 create mode 100644 wax-prosemirror-services/.gitignore

diff --git a/editors/editoria/src/Editoria.js b/editors/editoria/src/Editoria.js
index 2341165a6..8bad7ed11 100644
--- a/editors/editoria/src/Editoria.js
+++ b/editors/editoria/src/Editoria.js
@@ -48,7 +48,7 @@ const Editoria = () => (
       autoFocus
       placeholder="Type Something..."
       fileUpload={file => renderImage(file)}
-      value="<p> hello <code> this is the code</code></p>"
+      value="<p> <span style='font-style:italic;'>test</span>hello <code> this is the code</code></p>"
       layout={EditoriaLayout}
       user={user}
     />
diff --git a/wax-prosemirror-core/src/Wax.js b/wax-prosemirror-core/src/Wax.js
index 0ee634bb1..0bc808b5f 100644
--- a/wax-prosemirror-core/src/Wax.js
+++ b/wax-prosemirror-core/src/Wax.js
@@ -43,6 +43,7 @@ class Wax extends Component {
     super(props);
     this.application = Application.create(props);
     const schema = this.application.getSchema();
+    console.log(schema);
     this.application.bootServices();
 
     const { value, onChange } = this.props;
diff --git a/wax-prosemirror-services/.gitignore b/wax-prosemirror-services/.gitignore
new file mode 100644
index 000000000..7a2f31d8e
--- /dev/null
+++ b/wax-prosemirror-services/.gitignore
@@ -0,0 +1,21 @@
+# dependencies
+/node_modules
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+yarn.lock
+package-lock.json
diff --git a/wax-prosemirror-services/src/SchemaService/Mark.js b/wax-prosemirror-services/src/SchemaService/Mark.js
index bee9a57e6..eaa0e99e9 100644
--- a/wax-prosemirror-services/src/SchemaService/Mark.js
+++ b/wax-prosemirror-services/src/SchemaService/Mark.js
@@ -1,3 +1,4 @@
+import { isPlainObject } from "lodash";
 import ParseRule from "./ParseRule";
 import Middleware from "../lib/Middleware";
 
@@ -32,15 +33,23 @@ export default class Mark {
     Object.assign(this._attrs, value);
   }
 
-  set parseDOM(value) {
-    let parseRule = this._parseRules.find(
-      parseRule => parseRule.tag === value.tag
-    );
-    if (!parseRule) {
-      parseRule = new ParseRule(value);
-      this._parseRules.push(parseRule);
+  set parseDOM(parseDom) {
+    let values = parseDom;
+    if (isPlainObject(parseDom)) {
+      values = [parseDom];
     }
-    parseRule.addStack(value.getAttrs);
+    values.forEach(value => {
+      let parseRule = this._parseRules.find(parseRule => {
+        if (value.tag) return parseRule.tag === value.tag;
+        if (value.style) return parseRule.style === value.style;
+        return false;
+      });
+      if (!parseRule) {
+        parseRule = new ParseRule(value);
+        this._parseRules.push(parseRule);
+      }
+      parseRule.addStack(value.getAttrs);
+    });
   }
 
   toJSON() {
diff --git a/wax-prosemirror-services/src/SchemaService/Node.js b/wax-prosemirror-services/src/SchemaService/Node.js
index 3b7e738ec..085296aba 100644
--- a/wax-prosemirror-services/src/SchemaService/Node.js
+++ b/wax-prosemirror-services/src/SchemaService/Node.js
@@ -1,3 +1,4 @@
+import { isPlainObject } from "lodash";
 import ParseRule from "./ParseRule";
 import Middleware from "../lib/Middleware";
 
@@ -32,15 +33,23 @@ export default class Node {
     Object.assign(this._attrs, value);
   }
 
-  set parseDOM(value) {
-    let parseRule = this._parseRules.find(
-      parseRule => parseRule.tag === value.tag
-    );
-    if (!parseRule) {
-      parseRule = new ParseRule(value);
-      this._parseRules.push(parseRule);
+  set parseDOM(parseDom) {
+    let values = parseDom;
+    if (isPlainObject(parseDom)) {
+      values = [parseDom];
     }
-    parseRule.addStack(value.getAttrs);
+    values.forEach(value => {
+      let parseRule = this._parseRules.find(parseRule => {
+        if (value.tag) return parseRule.tag === value.tag;
+        if (value.style) return parseRule.style === value.style;
+        return false;
+      });
+      if (!parseRule) {
+        parseRule = new ParseRule(value);
+        this._parseRules.push(parseRule);
+      }
+      parseRule.addStack(value.getAttrs);
+    });
   }
 
   toJSON() {
diff --git a/wax-prosemirror-services/src/SchemaService/ParseRule.js b/wax-prosemirror-services/src/SchemaService/ParseRule.js
index f47be611b..03a91f519 100644
--- a/wax-prosemirror-services/src/SchemaService/ParseRule.js
+++ b/wax-prosemirror-services/src/SchemaService/ParseRule.js
@@ -2,11 +2,13 @@ import { omit } from "lodash";
 import Middleware from "../lib/Middleware";
 
 export default class ParseRule {
-  tag = "";
+  tag = null;
+  style = null;
   exporter = null;
 
-  constructor({ getAttrs, tag }) {
+  constructor({ getAttrs, tag, style }) {
     this.tag = tag;
+    this.style = style;
     if (getAttrs) {
       this.exporter = new Middleware();
     }
@@ -20,7 +22,15 @@ export default class ParseRule {
   }
 
   parseSchema(exporter) {
-    const rule = { tag: this.tag };
+    let rule = {};
+    if (this.tag) {
+      rule = { tag: this.tag };
+    }
+
+    if (this.style) {
+      rule = { style: this.style };
+    }
+
     if (this.exporter) {
       rule.getAttrs = dom => {
         let hooks = {};
-- 
GitLab