let fontURL =
"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/fonts/fontawesome-webfont.woff2";
let text = decodeHtmlEntity("");
let fontSize = 100;
let padding = 15;
let iconColor = '#fff';
let bgColor = 'red';
(async () => {
let font = await loadFont(fontURL);
let unitsPerEm = font.unitsPerEm;
let ratio = fontSize / unitsPerEm;
let ascender = font.ascender;
let glyph = font.stringToGlyphs(text)[0];
let bb = glyph.getBoundingBox();
let xOff = (fontSize - bb.x2 * ratio) / 2;
let width = fontSize + padding;
let height = fontSize + padding;
let pathD = font
.getPath(text, xOff + padding / 2, ascender * ratio + padding / 2, fontSize)
.toPathData();
let ns = "http://www.w3.org/2000/svg";
let svg = document.createElementNS(ns, "svg");
let circle = document.createElementNS(ns, "circle");
let path = document.createElementNS(ns, "path");
svg.setAttribute(
"viewBox",
`0 0 ${width} ${height}`
);
svg.setAttribute("width", width);
svg.setAttribute("height", height);
circle.setAttribute("cx", "50%");
circle.setAttribute("cy", "50%");
circle.setAttribute("r", "50%");
circle.setAttribute("fill", bgColor);
path.setAttribute("d", pathD);
path.setAttribute("fill", iconColor);
svg.append(circle);
svg.append(path);
preview.append(svg);
let dataURl =
"data:image/svg+xml, " +
new XMLSerializer()
.serializeToString(svg)
.replaceAll('"', "'")
.replaceAll("#", "%23");
imgData.src = dataURl;
})();
async function loadFont(src, options = {}) {
let buffer = {};
let font = {};
let ext = "woff2";
let url;
if (src instanceof Object) {
let filename = src.name.split(".");
ext = filename[filename.length - 1];
buffer = await src.arrayBuffer();
}
else if (/^data/.test(src)) {
let data = src.split(";");
ext = data[0].split("/")[1];
let srcBlob = await (await fetch(src)).blob();
buffer = await srcBlob.arrayBuffer();
}
else {
if (/googleapis.com/.test(src)) {
ext = "woff2";
src = await getGoogleFontUrl(src, options);
}
let hasExt =
src.includes(".woff2") ||
src.includes(".woff") ||
src.includes(".ttf") ||
src.includes(".otf")
? true
: false;
url = src.split(".");
ext = hasExt ? url[url.length - 1] : "woff2";
let fetchedSrc = await fetch(src);
buffer = await fetchedSrc.arrayBuffer();
}
if (ext === "woff2") {
buffer = Uint8Array.from(Module.decompress(buffer)).buffer;
}
font = opentype.parse(buffer);
return font;
}
function decodeHtmlEntity(str) {
let txt = document.createElement("p");
txt.innerHTML = str;
str = txt.textContent;
txt.remove();
return str;
}
svg{
border: 1px solid #ccc;
width:20em;
height:auto;
}
img{
border: 1px solid #ccc;
width:20em;
}
<h3>SVG</h3>
<div id="preview"></div>
<h3>Img</h3>
<img id="imgData" src="">
<script src="https://unpkg.com/wawoff2@2.0.1/build/decompress_binding.js"></script>
<script src='https://cdn.jsdelivr.net/npm/opentype.js@latest/dist/opentype.min.js'></script>