Skip to content

Instantly share code, notes, and snippets.

@espretto
Last active February 1, 2023 12:44
Show Gist options
  • Save espretto/bed01190dcc16a4cbb4b314cfc195d64 to your computer and use it in GitHub Desktop.
Save espretto/bed01190dcc16a4cbb4b314cfc195d64 to your computer and use it in GitHub Desktop.
ts: drop json into html script tags
const htmlSpecialChars = [
["&", "&"],
[">", ">"],
["<", "&lt;"],
];
const encode = (data: string) =>
htmlSpecialChars.reduce(
(data, [char, entity]) => data.replaceAll(char, entity),
data
);
const decode = (data: string) =>
htmlSpecialChars.reduceRight(
(data, [char, entity]) => data.replaceAll(entity, char),
data
);
const comment = (data: string) => ["<!--", "-->"].join(data);
const uncomment = (data: string) => data.slice(4, -3);
export interface ScriptProps {
id: string;
data: any;
}
export const toScript = ({ id, data }: ScriptProps) => {
const innerHTML = comment(encode(JSON.stringify(data)));
return `<script id="${id}" type="application/json">${innerHTML}</script>`;
};
export const fromScript = (id: string) => {
const innerHTML = document.getElementById(id)?.innerHTML;
return innerHTML ? JSON.parse(decode(uncomment(innerHTML))) : null
};
export const Script: React.FC<ScriptProps> = ({ id, data }) => {
const innerHTML = comment(encode(JSON.stringify(data)));
return React.createElement("script", {
id,
type: "application/json",
dangerouslySetInnerHTML: { __html: innerHTML },
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment