Skip to content

Commit e5b6b6c

Browse files
authored
Merge pull request #504 from components-ai/import-conversion
Improve HTML node imports
2 parents cfc92a5 + ebde90d commit e5b6b6c

File tree

9 files changed

+136
-19
lines changed

9 files changed

+136
-19
lines changed

.changeset/serious-cycles-switch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@compai/css-gui': patch
3+
---
4+
5+
Improve HTML node imports

packages/gui/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,18 @@
6464
"get-contrast": "^3.0.0",
6565
"hast-to-hyperscript": "^10.0.1",
6666
"hast-util-to-html": "^8.0.3",
67+
"hast-util-to-mdast": "^8.3.1",
6768
"immer": "^9.0.12",
6869
"lodash-es": "^4.17.21",
6970
"mdast-util-from-markdown": "^1.2.0",
7071
"mdast-util-to-hast": "^12.1.2",
72+
"mdast-util-to-markdown": "^1.3.0",
7173
"property-information": "^6.1.1",
7274
"react-feather": "^2.0.10",
73-
"react-use-gesture": "^9.1.3",
7475
"rehype-parse": "^8.0.4",
7576
"rehype-sanitize": "^5.0.1",
7677
"rehype-stringify": "^9.0.3",
78+
"remark-parse": "^10.0.1",
7779
"theme-ui": "^0.14.6",
7880
"unified": "^10.1.2",
7981
"unist-util-remove": "^3.1.0",

packages/gui/src/components/html/Import.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { startCase } from 'lodash-es'
2-
import { useState } from 'react'
3-
import { htmlToEditorSchema } from '../../lib'
2+
import { ChangeEvent, useState } from 'react'
43
import { HtmlNode } from './types'
54
import * as parsers from '../../lib/parsers'
5+
import { htmlToMd, mdToHtml } from '../../lib'
66

77
const PRE_STYLES = {
88
overflow: 'auto',
@@ -30,6 +30,20 @@ export const Import = ({ onChange }: ImportProps) => {
3030
const [src, setSrc] = useState<string>('')
3131
const [format, setFormat] = useState<string>('html')
3232

33+
const handleSetFormat = (e: ChangeEvent<HTMLSelectElement>) => {
34+
const newFormat = e.target.value
35+
36+
let newSrc = src
37+
if (newFormat === 'md') {
38+
newSrc = htmlToMd(src)
39+
} else if (newFormat === 'html') {
40+
newSrc = mdToHtml(src)
41+
}
42+
43+
setFormat(newFormat)
44+
setSrc(newSrc)
45+
}
46+
3347
const handleImport = () => {
3448
// @ts-ignore
3549
const newValue = parsers[format](src)
@@ -46,7 +60,7 @@ export const Import = ({ onChange }: ImportProps) => {
4660
<div sx={{ px: 3, pb: 4, display: 'flex', alignItems: 'center' }}>
4761
<select
4862
value={format}
49-
onChange={(e) => setFormat(e.target.value)}
63+
onChange={handleSetFormat}
5064
sx={{
5165
mr: 2,
5266
px: 1,

packages/gui/src/lib/parsers/html.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { htmlToEditorSchema } from '../transformers'
22

33
export const html = (htmlString: string) => {
44
// TODO: Use unified to wrap and remove doctype
5-
const fullString = `<div>${htmlString.replace('<!DOCTYPE html>', '')}</div>`
5+
const fullString = `<div><div>${htmlString.replace(
6+
'<!DOCTYPE html>',
7+
''
8+
)}</div></div>`
69
const data = htmlToEditorSchema(fullString)
710
return data
811
}

packages/gui/src/lib/parsers/md.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ import { toHast } from 'mdast-util-to-hast'
33
import { hastToEditorSchema } from '../transformers/hast-to-editor-schema'
44

55
export const md = (mdString: string) => {
6-
const tree = toHast(fromMarkdown(mdString))
7-
// @ts-ignore
8-
const node = hastToEditorSchema(tree)
9-
return {
10-
type: 'element',
11-
tagName: 'div',
12-
children: [node],
13-
}
6+
const tree = toHast(fromMarkdown(mdString))!
7+
return hastToEditorSchema({
8+
type: 'root',
9+
children: [
10+
{
11+
type: 'element',
12+
tagName: 'div',
13+
children: (tree as any).children,
14+
},
15+
],
16+
})
1417
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { unified } from 'unified'
2+
import rehypeParse from 'rehype-parse'
3+
import { toMdast } from 'hast-util-to-mdast'
4+
import { toMarkdown } from 'mdast-util-to-markdown'
5+
6+
export const htmlToMd = (text: string) => {
7+
const tree = unified().use(rehypeParse, { fragment: true }).parse(text)
8+
const mdast = toMdast(tree)
9+
return toMarkdown(mdast)
10+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
export * from './html-to-editor-schema'
2+
export * from './html-to-md'
3+
export * from './md-to-html'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { toHast } from 'mdast-util-to-hast'
2+
import { toHtml } from 'hast-util-to-html'
3+
import { fromMarkdown } from 'mdast-util-from-markdown'
4+
5+
export const mdToHtml = (text: string) => {
6+
const mdast = fromMarkdown(text)
7+
const hast = toHast(mdast)!
8+
return toHtml(hast)
9+
}

yarn.lock

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,11 @@
18261826
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe"
18271827
integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==
18281828

1829+
"@types/extend@^3.0.0":
1830+
version "3.0.1"
1831+
resolved "https://registry.yarnpkg.com/@types/extend/-/extend-3.0.1.tgz#923dc2d707d944382433e01d6cc0c69030ab2c75"
1832+
integrity sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==
1833+
18291834
"@types/glob@^7.1.1":
18301835
version "7.2.0"
18311836
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
@@ -4308,6 +4313,13 @@ hast-to-hyperscript@^10.0.1:
43084313
unist-util-is "^5.0.0"
43094314
web-namespaces "^2.0.0"
43104315

4316+
hast-util-embedded@^2.0.0:
4317+
version "2.0.0"
4318+
resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-2.0.0.tgz#877f4261044854743fc2621f728930ca61c8376f"
4319+
integrity sha512-vEr54rDu2CheBM4nLkWbW8Rycf8HhkA/KsrDnlyKnvBTyhyO+vAG6twHnfUbiRGo56YeUBNCI4HFfHg3Wu+tig==
4320+
dependencies:
4321+
hast-util-is-element "^2.0.0"
4322+
43114323
hast-util-from-parse5@^7.0.0:
43124324
version "7.1.0"
43134325
resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz#c129dd3a24dd8a867ab8a029ca47e27aa54864b7"
@@ -4392,13 +4404,42 @@ hast-util-to-html@^8.0.0, hast-util-to-html@^8.0.3:
43924404
stringify-entities "^4.0.2"
43934405
unist-util-is "^5.0.0"
43944406

4407+
hast-util-to-mdast@^8.3.1:
4408+
version "8.3.1"
4409+
resolved "https://registry.yarnpkg.com/hast-util-to-mdast/-/hast-util-to-mdast-8.3.1.tgz#b2e3b666968d3ab96a0e6ec991cca0ca5c79e3b2"
4410+
integrity sha512-nxLcom1oW5y/1CyaV24K16LOfYbAIS74BDbCPW6WduzAYTAVDp3g/DM1CY6Ngo+Dx5itLzvmCm7SnUHBZd3NVQ==
4411+
dependencies:
4412+
"@types/extend" "^3.0.0"
4413+
"@types/hast" "^2.0.0"
4414+
"@types/mdast" "^3.0.0"
4415+
"@types/unist" "^2.0.0"
4416+
extend "^3.0.0"
4417+
hast-util-has-property "^2.0.0"
4418+
hast-util-is-element "^2.0.0"
4419+
hast-util-to-text "^3.0.0"
4420+
mdast-util-phrasing "^3.0.0"
4421+
mdast-util-to-string "^3.0.0"
4422+
rehype-minify-whitespace "^5.0.0"
4423+
trim-trailing-lines "^2.0.0"
4424+
unist-util-is "^5.0.0"
4425+
unist-util-visit "^4.0.0"
4426+
43954427
hast-util-to-string@^2.0.0:
43964428
version "2.0.0"
43974429
resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz#b008b0a4ea472bf34dd390b7eea1018726ae152a"
43984430
integrity sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==
43994431
dependencies:
44004432
"@types/hast" "^2.0.0"
44014433

4434+
hast-util-to-text@^3.0.0:
4435+
version "3.1.1"
4436+
resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.1.tgz#b7699a75f7a61af6e0befb67660cd78460d96dc6"
4437+
integrity sha512-7S3mOBxACy8syL45hCn3J7rHqYaXkxRfsX6LXEU5Shz4nt4GxdjtMUtG+T6G/ZLUHd7kslFAf14kAN71bz30xA==
4438+
dependencies:
4439+
"@types/hast" "^2.0.0"
4440+
hast-util-is-element "^2.0.0"
4441+
unist-util-find-after "^4.0.0"
4442+
44024443
hast-util-whitespace@^2.0.0:
44034444
version "2.0.0"
44044445
resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c"
@@ -5783,6 +5824,14 @@ mdast-util-mdxjs-esm@^1.0.0:
57835824
mdast-util-from-markdown "^1.0.0"
57845825
mdast-util-to-markdown "^1.0.0"
57855826

5827+
mdast-util-phrasing@^3.0.0:
5828+
version "3.0.0"
5829+
resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.0.tgz#c44fcf6be61a3cb8da54ab2df22320e61d4537ce"
5830+
integrity sha512-S+QYsDRLkGi8U7o5JF1agKa/sdP+CNGXXLqC17pdTVL8FHHgQEiwFGa9yE5aYtUxNiFGYoaDy9V1kC85Sz86Gg==
5831+
dependencies:
5832+
"@types/mdast" "^3.0.0"
5833+
unist-util-is "^5.0.0"
5834+
57865835
mdast-util-to-hast@^12.1.0:
57875836
version "12.1.1"
57885837
resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca"
@@ -6985,11 +7034,6 @@ react-style-singleton@^2.1.0:
69857034
invariant "^2.2.4"
69867035
tslib "^1.0.0"
69877036

6988-
react-use-gesture@^9.1.3:
6989-
version "9.1.3"
6990-
resolved "https://registry.yarnpkg.com/react-use-gesture/-/react-use-gesture-9.1.3.tgz#92bd143e4f58e69bd424514a5bfccba2a1d62ec0"
6991-
integrity sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==
6992-
69937037
69947038
version "18.1.0"
69957039
resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890"
@@ -7103,6 +7147,18 @@ rehype-autolink-headings@^6.1.1:
71037147
unified "^10.0.0"
71047148
unist-util-visit "^4.0.0"
71057149

7150+
rehype-minify-whitespace@^5.0.0:
7151+
version "5.0.1"
7152+
resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz#79729a0146aa97a9d43e1eb4b5884974e2f37e77"
7153+
integrity sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ==
7154+
dependencies:
7155+
"@types/hast" "^2.0.0"
7156+
hast-util-embedded "^2.0.0"
7157+
hast-util-is-element "^2.0.0"
7158+
hast-util-whitespace "^2.0.0"
7159+
unified "^10.0.0"
7160+
unist-util-is "^5.0.0"
7161+
71067162
rehype-parse@^8.0.4:
71077163
version "8.0.4"
71087164
resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688"
@@ -7169,7 +7225,7 @@ remark-mdx@^2.0.0:
71697225
mdast-util-mdx "^2.0.0"
71707226
micromark-extension-mdxjs "^1.0.0"
71717227

7172-
remark-parse@^10.0.0:
7228+
remark-parse@^10.0.0, remark-parse@^10.0.1:
71737229
version "10.0.1"
71747230
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775"
71757231
integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==
@@ -7979,6 +8035,11 @@ trim-newlines@^3.0.0:
79798035
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
79808036
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
79818037

8038+
trim-trailing-lines@^2.0.0:
8039+
version "2.0.0"
8040+
resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-2.0.0.tgz#1fdfbc20db6651bed117bc5c736f6cf052bcf421"
8041+
integrity sha512-lyJ/STqmYO8k9aWZbodPTrVkRh/50yFwNZ/HxKp/30eM9zf898MgQCG/NxfMnx7fZSKbaEcuZ1V+QgWrXFH6rg==
8042+
79828043
trough@^2.0.0:
79838044
version "2.1.0"
79848045
resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876"
@@ -8252,6 +8313,14 @@ unist-builder@^3.0.0:
82528313
dependencies:
82538314
"@types/unist" "^2.0.0"
82548315

8316+
unist-util-find-after@^4.0.0:
8317+
version "4.0.0"
8318+
resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.0.tgz#1101cebf5fed88ae3c6f3fa676e86fd5772a4f32"
8319+
integrity sha512-gfpsxKQde7atVF30n5Gff2fQhAc4/HTOV4CvkXpTg9wRfQhZWdXitpyXHWB6YcYgnsxLx+4gGHeVjCTAAp9sjw==
8320+
dependencies:
8321+
"@types/unist" "^2.0.0"
8322+
unist-util-is "^5.0.0"
8323+
82558324
unist-util-generated@^2.0.0:
82568325
version "2.0.0"
82578326
resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113"

0 commit comments

Comments
 (0)