Skip to content

Commit 68365ac

Browse files
authored
Initial javascript support in html projects (#748)
Small tweaks to allow javascript files in HTML projects rather than relying on inline styles
1 parent 3cc9e70 commit 68365ac

File tree

6 files changed

+54
-8
lines changed

6 files changed

+54
-8
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
88

99
### Added
1010

11+
- Javascript support for HTML projects (#748)
1112
- DownloadPanel for sidebar (#744)
1213
- Custom events for Log In and Sign Up from DownloadPanel (#744)
1314
- SVGO config file (#720)

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"@codemirror/commands": "^6.1.1",
99
"@codemirror/lang-css": "^6.0.0",
1010
"@codemirror/lang-html": "^6.1.2",
11-
"@codemirror/lang-javascript": "^6.1.0",
11+
"@codemirror/lang-javascript": "^6.2.1",
1212
"@codemirror/lang-python": "^6.0.2",
1313
"@codemirror/language": "^6.2.1",
1414
"@codemirror/view": "^6.3.0",
@@ -43,6 +43,7 @@
4343
"js-convert-case": "^4.2.0",
4444
"jszip": "^3.10.1",
4545
"jszip-utils": "^0.1.0",
46+
"mime-types": "^2.1.35",
4647
"node-html-parser": "^6.1.5",
4748
"oidc-client": "^1.11.5",
4849
"parse-link-header": "^2.0.0",

src/components/Editor/EditorPanel/EditorPanel.jsx

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { indentUnit } from "@codemirror/language";
1515
import { html } from "@codemirror/lang-html";
1616
import { css } from "@codemirror/lang-css";
1717
import { python } from "@codemirror/lang-python";
18+
import { javascript } from "@codemirror/lang-javascript";
1819

1920
import { editorLightTheme } from "../../../assets/themes/editorLightTheme";
2021
import { editorDarkTheme } from "../../../assets/themes/editorDarkTheme";
@@ -55,6 +56,8 @@ const EditorPanel = ({ extension = "html", fileName = "index" }) => {
5556
return css();
5657
case "py":
5758
return python();
59+
case "js":
60+
return javascript();
5861
default:
5962
return html();
6063
}

src/components/Editor/Runners/HtmlRunner/HtmlRunner.jsx

+18-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import React, { useRef, useEffect, useState } from "react";
44
import { useDispatch, useSelector } from "react-redux";
55
import { parse } from "node-html-parser";
66
import { useMediaQuery } from "react-responsive";
7+
import mimeTypes from "mime-types";
78

89
import ErrorModal from "../../../Modals/ErrorModal";
910
import {
@@ -235,7 +236,9 @@ function HtmlRunner() {
235236
if (parentTag(hrefNode, "head")) {
236237
const projectFileBlob = getBlobURL(
237238
cssProjectImgs(projectFile[0]).content,
238-
`text/${projectFile[0].extension}`,
239+
mimeTypes.lookup(
240+
`${projectFile[0].name}.${projectFile[0].extension}`,
241+
),
239242
);
240243
hrefNode.setAttribute("href", projectFileBlob);
241244
} else {
@@ -277,10 +280,21 @@ function HtmlRunner() {
277280
const projectImage = projectImages.filter(
278281
(component) => component.filename === srcNode.attrs.src,
279282
);
280-
srcNode.setAttribute(
281-
"src",
282-
!!projectImage.length ? projectImage[0].url : "",
283+
const projectFile = projectCode.filter(
284+
(file) => `${file.name}.${file.extension}` === srcNode.attrs.src,
283285
);
286+
let src = "";
287+
if (projectImage.length) {
288+
src = projectImage[0].url;
289+
} else if (projectFile.length) {
290+
src = getBlobURL(
291+
projectFile[0].content,
292+
mimeTypes.lookup(
293+
`${projectFile[0].name}.${projectFile[0].extension}`,
294+
),
295+
);
296+
}
297+
srcNode.setAttribute("src", src);
284298
});
285299

286300
body.appendChild(parse(`<meta filename="${previewFile}" />`));

src/utils/componentNameValidation.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { setNameError } from "../redux/EditorSlice";
22

33
const allowedExtensions = {
44
python: ["py", "csv", "txt"],
5-
html: ["html", "css"],
5+
html: ["html", "css", "js"],
66
};
77

88
const allowedExtensionsString = (projectType, t) => {

yarn.lock

+29-2
Original file line numberDiff line numberDiff line change
@@ -1189,7 +1189,7 @@
11891189
"@lezer/css" "^1.1.0"
11901190
"@lezer/html" "^1.3.0"
11911191

1192-
"@codemirror/lang-javascript@^6.0.0", "@codemirror/lang-javascript@^6.1.0":
1192+
"@codemirror/lang-javascript@^6.0.0":
11931193
version "6.1.7"
11941194
resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.7.tgz#e39fb9757b1cf47de432e4244d18ca5284a73a58"
11951195
integrity sha512-KXKqxlZ4W6t5I7i2ScmITUD3f/F5Cllk3kj0De9P9mFeYVfhOVOWuDLgYiLpk357u7Xh4dhqjJAnsNPPoTLghQ==
@@ -1202,6 +1202,19 @@
12021202
"@lezer/common" "^1.0.0"
12031203
"@lezer/javascript" "^1.0.0"
12041204

1205+
"@codemirror/lang-javascript@^6.2.1":
1206+
version "6.2.1"
1207+
resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.2.1.tgz#8068d44365d13cdb044936fb4e3483301c12ef95"
1208+
integrity sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==
1209+
dependencies:
1210+
"@codemirror/autocomplete" "^6.0.0"
1211+
"@codemirror/language" "^6.6.0"
1212+
"@codemirror/lint" "^6.0.0"
1213+
"@codemirror/state" "^6.0.0"
1214+
"@codemirror/view" "^6.17.0"
1215+
"@lezer/common" "^1.0.0"
1216+
"@lezer/javascript" "^1.0.0"
1217+
12051218
"@codemirror/lang-python@^6.0.2":
12061219
version "6.1.2"
12071220
resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-6.1.2.tgz#cabb57529679981f170491833dbf798576e7ab18"
@@ -1255,6 +1268,15 @@
12551268
style-mod "^4.0.0"
12561269
w3c-keyname "^2.2.4"
12571270

1271+
"@codemirror/view@^6.17.0":
1272+
version "6.22.0"
1273+
resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.22.0.tgz#5a5214a04f149ecf54c4803b7fec9bdac56d0d74"
1274+
integrity sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==
1275+
dependencies:
1276+
"@codemirror/state" "^6.1.4"
1277+
style-mod "^4.1.0"
1278+
w3c-keyname "^2.2.4"
1279+
12581280
12591281
version "1.5.0"
12601282
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
@@ -9364,7 +9386,7 @@ [email protected], "mime-db@>= 1.43.0 < 2":
93649386
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
93659387
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
93669388

9367-
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
9389+
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
93689390
version "2.1.35"
93699391
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
93709392
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -13194,6 +13216,11 @@ style-mod@^4.0.0:
1319413216
resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.3.tgz#136c4abc905f82a866a18b39df4dc08ec762b1ad"
1319513217
integrity sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==
1319613218

13219+
style-mod@^4.1.0:
13220+
version "4.1.0"
13221+
resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.0.tgz#a313a14f4ae8bb4d52878c0053c4327fb787ec09"
13222+
integrity sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==
13223+
1319713224
style-search@^0.1.0:
1319813225
version "0.1.0"
1319913226
resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"

0 commit comments

Comments
 (0)