css-font-parser
Version:
A parser for the CSS font value
3 lines (2 loc) • 2.2 kB
JavaScript
function e(e){return!/^(-?\d|--)/.test(e)}function t(t){const l=[];let n="",s="",f=7;for(let i,r=0;i=t.charAt(r);r++)if(/[a-zA-Z\d\xa0-\uffff_-]/.test(i)&&7===f)n+=i;else if("\\"===i&&7===f)f=6;else if(" "===i&&7===f){if(""!==n){if(!e(n))return null;l.push(n),n=""}}else if(6===f)/[0-9a-f]/i.test(i)?(s+=i,f=8):(n+=i,f=7);else{if(8!==f)return null;/[0-9a-f]/i.test(i)&&s.length<6?s+=i:(n+=String.fromCodePoint(parseInt(s,16)),n+=i,s="",f=7)}if(""!==n){if(!e(n))return null;l.push(n)}return l.join(" ")}function l(e,l){let n=l,s="";const f={"font-family":[]};for(let l,i=0;l=e.charAt(i);i+=1)if(4!==n||'"'!==l&&"'"!==l)if(3===n&&","===l)n=4,s="";else if(4===n&&","===l){const e=t(s);e&&f["font-family"].push(e),s=""}else if(5===n&&" "===l)/^(?:\+|-)?(?:[0-9]*\.)?[0-9]+(?:deg|grad|rad|turn)$/.test(s)?(f["font-style"]+=" "+s,s=""):i-=1,n=1;else if(1!==n||" "!==l&&"/"!==l)2===n&&" "===l?(/^(?:\+|-)?([0-9]*\.)?[0-9]+(?:em|ex|ch|rem|vh|vw|vmin|vmax|px|mm|cm|in|pt|pc|%)?$/.test(s)&&(f["line-height"]=s),n=4,s=""):s+=l;else{if(/^(?:(?:xx|x)-large|(?:xx|s)-small|small|large|medium)$/.test(s)||/^(?:larg|small)er$/.test(s)||/^(?:\+|-)?(?:[0-9]*\.)?[0-9]+(?:em|ex|ch|rem|vh|vw|vmin|vmax|px|mm|cm|in|pt|pc|%)$/.test(s))n="/"===l?2:4,f["font-size"]=s;else if(/^italic$/.test(s))f["font-style"]=s;else if(/^oblique$/.test(s))f["font-style"]=s,n=5;else if(/^small-caps$/.test(s))f["font-variant"]=s;else if(/^(?:bold(?:er)?|lighter|normal)$/.test(s))f["font-weight"]=s;else if(/^[+-]?(?:[0-9]*\.)?[0-9]+(?:e[+-]?(?:0|[1-9][0-9]*))?$/.test(s)){const e=parseFloat(s);e>=1&&e<=1e3&&(f["font-weight"]=s)}else/^(?:(?:ultra|extra|semi)-)?(?:condensed|expanded)$/.test(s)&&(f["font-stretch"]=s);s=""}else{let t=i+1;do{if(t=e.indexOf(l,t)+1,!t)return null}while("\\"===e.charAt(t-2));f["font-family"].push(e.slice(i+1,t-1).replace(/\\('|")/g,"$1")),i=t-1,n=3,s=""}if(3===n&&!/^\s*$/.test(s))return null;if(4===n){const e=t(s);e&&f["font-family"].push(e)}return f}function n(e){const t=l(e,4);return null!==t?t["font-family"]:null}function s(e){const t=l(e,1);return null!==t&&t["font-size"]&&t["font-family"].length?t:null}export{s as parseFont,n as parseFontFamily};
//# sourceMappingURL=css-font-parser.modern.js.map