Skip to content

Commit c9693a3

Browse files
author
Zaydek Michels-Gualtieri
committed
Integrated SemanticScanner and revised decorator
1 parent dd1ac6d commit c9693a3

7 files changed

Lines changed: 58 additions & 47 deletions

File tree

src/Editor/TODO/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import * as Readers from "../Readers"
22
import decorate from "../decorate"
33
import methods from "./methods"
4+
import parseTree from "lib/parseTree"
45
import React from "react"
56
import ReactDOMServer from "react-dom/server"
6-
import renderMarkupTree from "lib/renderMarkupTree"
77
import useMethods from "use-methods"
88

99
// // TODO
@@ -49,10 +49,10 @@ function useEditor({ markup, children }) {
4949
}
5050
let domTree = null
5151
if (markup !== undefined) {
52-
domTree = renderMarkupTree("<div>" + markup + "</div>")
52+
domTree = parseTree("<div>" + markup + "</div>")
5353
} else if (children !== undefined) {
5454
const markup = ReactDOMServer.renderToStaticMarkup(children) // Shadows markup
55-
domTree = renderMarkupTree("<div>" + markup + "</div>")
55+
domTree = parseTree("<div>" + markup + "</div>")
5656
}
5757
decorate(domTree)
5858
return Readers.semantic.elements(domTree)

src/Editor/components/components.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import deeplySyncTrees from "../utils/deeplySyncTrees"
2+
import parseTree from "lib/parseTree"
23
import React from "react"
34
import ReactDOMServer from "react-dom/server"
4-
import renderMarkupTree from "lib/renderMarkupTree"
55
import T from "./T"
66
import toReact from "./toReact"
77
import types from "../types"
@@ -17,12 +17,12 @@ const Node = ({ id, style, children, ...props }) => {
1717
// NOTE: Uses ReactDOMServer.renderToStaticMarkup
1818
// because ReactDOM.render is asynchronous.
1919
const markup = ReactDOMServer.renderToStaticMarkup(children)
20-
const domTree = renderMarkupTree("<div>" + markup + "</div>")
20+
const tree = parseTree("<div>" + markup + "</div>")
2121

2222
// ;[...ref.current.childNodes].reverse().map(each => each.remove())
23-
// ref.current.append(...domTree.childNodes)
23+
// ref.current.append(...tree.childNodes)
2424

25-
deeplySyncTrees(domTree, ref.current)
25+
deeplySyncTrees(tree, ref.current)
2626
}, [children])
2727

2828
return (

src/Editor/decorate.js

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/Editor/useEditor.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import Editor from "./model/Editor"
1+
import decorator from "./utils/decorator"
2+
import Editor from "./model/Editor/Editor"
3+
import parseTree from "lib/parseTree"
24
import React from "react"
5+
import SemanticScanner from "./model/Scanners/SemanticScanner"
36

47
function EditorReducer(state, action) {
58
switch (action.type) {
@@ -20,8 +23,9 @@ function EditorReducer(state, action) {
2023

2124
function useEditor(html) {
2225
const initialState = React.useMemo(() => {
23-
const r = new HTMLReader().read(html)
24-
const elements = r.read(html)
26+
const tree = parseTree("<div>" + html.trim() + "</div>", decorator)
27+
const scanner = new SemanticScanner()
28+
const elements = scanner.scan(tree)
2529
return new Editor(elements)
2630
}, [html])
2731
return React.useReducer(EditorReducer, initialState)

src/Editor/utils/decorator.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import domUtils from "lib/domUtils"
2+
3+
// Decorates a tree; removes extraneous tabs and EOLs.
4+
//
5+
// ^ - BOF
6+
// \n - EOL
7+
// \t{depth} - $depth tabs
8+
// | - OR
9+
// \n - EOL
10+
// \t{depth - 1, depth} - $depth - 1 to $depth tabs
11+
// $ - EOF
12+
//
13+
function decorator(tree) {
14+
const recurse = (on, depth = -1) => {
15+
if (domUtils.isTextNode(on)) {
16+
const tabsRe = new RegExp(`^\\n\\t{${depth}}|\\n\\t{${Math.max(0, depth - 1)},${depth}}?$`, "g")
17+
on.nodeValue = on.nodeValue.replace(tabsRe, "")
18+
if (!on.nodeValue) {
19+
on.remove()
20+
}
21+
return
22+
}
23+
// NOTE: Uses reverse because of remove.
24+
for (const each of [...on.childNodes].reverse()) {
25+
recurse(each, depth + 1)
26+
}
27+
}
28+
recurse(tree)
29+
return tree
30+
}
31+
32+
export default decorator

src/lib/parseTree.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Parses markup to a tree. A decorator can be used to
2+
// decorate the parsed tree.
3+
function parseTree(markup, decorator = null) {
4+
const doc = new DOMParser().parseFromString(markup, "text/html")
5+
const tree = doc.body.childNodes[0]
6+
if (decorator) {
7+
decorator(tree)
8+
}
9+
return tree
10+
}
11+
12+
export default parseTree

src/lib/renderMarkupTree.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)