<!DOCTYPE html>
<html>
<head>
<script data-require="jquery@*" data-semver="3.1.1" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<h1>Local Google Font Generator!</h1>
<p><b>Example Input:</b> https://fonts.googleapis.com/css?family=Barrio</p>
<input id="font-input" placeholder="https://fonts.googleapis.com/css?family=Barrio" type="text">
<button id="font-btn" type="submit">
Generate CSS
</button>
<textarea id="processed-css"></textarea>
</body>
</html>
function fontLinkToBase64(link) {
return new Promise(function(resolve, reject) {
$.get(link, function(data, status, xhr){
var contentType = xhr.getResponseHeader('content-type');
const base64Data = 'data:' + contentType + ';charset=utf-8;base64,' + btoa(unescape(encodeURIComponent(data)));
const dataObj = {
link: link,
base64: base64Data
}
resolve(dataObj);
});
});
}
function getProcessedCSS(css) {
return new Promise(function(resolve, reject) {
const fontLinkRegex = new RegExp(/(https?:\/\/(fonts\.)[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,})\w/, 'ig');
const matches = css.match(fontLinkRegex);
// BUG: the last url always throws errors when converted to base64 for some reason.
matches.splice(-1,1);
var promises = [];
matches.forEach(function(link) {
promises.push(fontLinkToBase64(link));
});
Promise.all(promises).then(function(fontData) {
fontData.forEach(function(data) {
css = css.replace(data.link, data.base64);
});
resolve(css);
});
});
}
window.onload = function() {
const fontInput = $('#font-input');
const textarea = $('#processed-css');
$('#font-btn').on('click', function() {
const url = fontInput.val();
$.get(url, function(css) {
getProcessedCSS(css).then(function(processedCSS) {
textarea.val(processedCSS);
});
});
});
};
#font-input {
border: 2px solid #000;
border-radius: 5px;
padding: 5px 7px;
}
#font-btn {
padding: 5px 7px;
border: 2px solid #000;
border-radius: 5px;
background-color: #000;
color: #fff;
}
#font-btn:hover {
background-color: white;
color: black;
cursor: pointer;
}
#processed-css {
margin-top: 30px;
padding: 10px;
width: 100%;
height: 100%;
min-height: 500px;
border-radius: 5px;
border: 2px solid #000;
}