Browse Source

compileReact function added

develop
arunkumar 4 years ago
parent
commit
cfb8e5e624
  1. 17
      constants/index.js
  2. 22
      lib/compileHTML.js
  3. 59
      lib/compileReact.js
  4. 31
      package-lock.json
  5. 7
      package.json

17
constants/index.js

@ -0,0 +1,17 @@
const BOLD = "bold";
const TEXT = "text";
const ITALICS = "italics";
const STRIKETHROUGH = "strikethrough";
const UNDERLINE = "underline";
const URL = "url";
const PARAGRAPH = "paragraph";
module.exports = {
BOLD,
TEXT,
ITALICS,
STRIKETHROUGH,
UNDERLINE,
URL,
PARAGRAPH,
};

22
lib/compileHTML.js

@ -1,12 +1,21 @@
const {
BOLD,
TEXT,
ITALICS,
STRIKETHROUGH,
UNDERLINE,
URL,
} = require("../constants");
function CompileHTML(ast) { function CompileHTML(ast) {
let str = "<p>"; let str = "<p>";
const OpenTags = { const OpenTags = {
bold: () => `<span class="bold">`, bold: () => `<span class="${BOLD}">`,
text: () => `<span class="text">`, text: () => `<span class="${TEXT}">`,
italics: () => `<span class="italics">`, italics: () => `<span class="${ITALICS}">`,
strikethrough: () => `<span class="strikethrough">`, strikethrough: () => `<span class="${STRIKETHROUGH}">`,
underline: () => `<span class="underline">`, underline: () => `<span class="${UNDERLINE}">`,
url: url => `<a href="${url}" class="url">`, url: url => `<a href="${url}" class="${URL}">`,
}; };
const CloseTags = { const CloseTags = {
@ -17,6 +26,7 @@ function CompileHTML(ast) {
underline: "</span>", underline: "</span>",
url: "</a>", url: "</a>",
}; };
const mapper = node => { const mapper = node => {
node.forEach(element => { node.forEach(element => {
if (typeof element === "string") { if (typeof element === "string") {

59
lib/compileReact.js

@ -0,0 +1,59 @@
const h = require("react").createElement;
const {
BOLD,
TEXT,
ITALICS,
STRIKETHROUGH,
UNDERLINE,
URL,
PARAGRAPH,
} = require("../constants");
function CompileReact(ast) {
const OpenTags = {
bold: "span",
text: "span",
italics: "span",
strikethrough: "span",
underline: "span",
url: "a",
paragraph: "p",
};
const classNames = {
bold: BOLD,
text: TEXT,
italics: ITALICS,
strikethrough: STRIKETHROUGH,
underline: UNDERLINE,
url: URL,
paragraph: PARAGRAPH,
};
const mapper = node =>
node.map((element, index) => {
if (typeof element === "string") {
return element;
} else if (typeof element === "object") {
const makeProps = () => {
let props = {};
if (element.type === "url") {
props.href = element.url;
}
props.className = classNames[element.type];
props.key = element.type + "-" + index;
return props;
};
return h(
OpenTags[element.type],
makeProps(),
element.children && mapper(element.children),
);
}
});
return h("p", { className: PARAGRAPH }, mapper(ast));
}
module.exports = CompileReact;

31
package-lock.json

@ -414,6 +414,12 @@
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
"dev": true "dev": true
}, },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"js-yaml": { "js-yaml": {
"version": "3.14.0", "version": "3.14.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
@ -442,6 +448,15 @@
"chalk": "^4.0.0" "chalk": "^4.0.0"
} }
}, },
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@ -502,6 +517,12 @@
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true "dev": true
}, },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -568,6 +589,16 @@
"safe-buffer": "^5.1.0" "safe-buffer": "^5.1.0"
} }
}, },
"react": {
"version": "17.0.1",
"resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz",
"integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==",
"dev": true,
"requires": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
}
},
"readdirp": { "readdirp": {
"version": "3.5.0", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",

7
package.json

@ -10,7 +10,10 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"chai": "^4.2.0", "chai": "^4.2.0",
"html-format": "^1.0.1", "mocha": "^8.2.1",
"mocha": "^8.2.1" "react": "*"
},
"peerDependencies": {
"react": "*"
} }
} }

Loading…
Cancel
Save