2011-04-11 5 views
9

Necesito analizar el formato abreviado de fuente CSS en los componentes separados (font-family, font-size, font-weight, ...). Este formato abreviado parece bastante complicado. He aquí dos ejemplos:Cómo analizar el formato abreviado de fuente CSS

10px sans-serif 
bold italic small-caps 1em/1.5em verdana,sans-serif 

Antes de empezar a escribir un analizador para ello, es que hay un analizador que ya existe por ahí que podría utilizar (preferiblemente escrito en JavaScript)?

+2

¿Por qué necesita para hacer esto? El navegador tiene un analizador incorporado que hace esto: ¿no sería más fácil aplicar la cadena de propiedad 'font' a un elemento temporal y leer las propiedades separadas? – thirtydot

+0

Estoy de acuerdo con thirtydot, incluso puedes copiar el css analizado de herramientas de desarrollador o firebug. –

+1

Pensé en eso, pero no funciona. Al configurar "font", otras propiedades como fontSize y fontFamily siguen vacías. tal vez funcione en tu navegador, mi Chrome no lo admite. – kayahr

Respuesta

11

Aquí hay un "elemento DOM temporal y usando css() la función de jQuery" solución:

http://jsfiddle.net/thirtydot/tpSsE/2/

var $test = $('<span />'); 
$test.css('font', 'bold italic small-caps 1em/1.5em verdana,sans-serif'); 

alert($test.css('fontWeight')); 
alert($test.css('fontStyle')); 
alert($test.css('fontVariant')); 
alert($test.css('fontSize')); 
alert($test.css('lineHeight')); 
alert($test.css('fontFamily')); 

+1

[Creo que encontrará] (http://jsfiddle.net/Mzrmd/) '$ test' apunta al elemento' body' (su ejemplo elimina el elemento 'body'). Desea 'var $ test = $ ('') .appendTo ('body')'. :) – alex

+0

@alex: Gracias, tienes razón. Me confundí :( – thirtydot

+1

Fyi, no es necesario insertar el elemento '$ test' en el DOM (la parte' .appendTo ('body') 'de la primera línea) para que esto funcione. ya no necesita la declaración '$ test.remove()'. No es un gran problema, solo un poco más limpio y probablemente una ganancia de rendimiento muy pequeña. –

5

Aquí es mi propio intento humilde de una función de fuente analizador acabo creado. Pero no estoy seguro de si funciona con todas las especialidades del formato de letra abreviada.

function parseFont(font) 
{ 
    var fontFamily = null, 
     fontSize = null, 
     fontStyle = "normal", 
     fontWeight = "normal", 
     fontVariant = "normal", 
     lineHeight = "normal"; 

    var elements = font.split(/\s+/); 
    outer: while (element = elements.shift()) 
    { 
     switch (element) 
     { 
      case "normal": 
       break; 

      case "italic": 
      case "oblique": 
       fontStyle = element; 
       break; 

      case "small-caps": 
       fontVariant = element; 
       break; 

      case "bold": 
      case "bolder": 
      case "lighter": 
      case "100": 
      case "200": 
      case "300": 
      case "400": 
      case "500": 
      case "600": 
      case "700": 
      case "800": 
      case "900": 
       fontWeight = element; 
       break; 

      default: 
       if (!fontSize) 
       { 
        var parts = element.split("/"); 
        fontSize = parts[0]; 
        if (parts.length > 1) lineHeight = parts[1]; 
        break; 
       } 

       fontFamily = element; 
       if (elements.length) 
        fontFamily += " " + elements.join(" "); 
       break outer; 
     } 
    } 

    return { 
     "fontStyle": fontStyle, 
     "fontVariant": fontVariant, 
     "fontWeight": fontWeight, 
     "fontSize": fontSize, 
     "lineHeight": lineHeight, 
     "fontFamily": fontFamily 
    } 
} 
+0

+1, parece correcto con un par de pruebas rápidas, con una entrada válida. – thirtydot

3

puro de corral Javascript versión:

var parsedStyleForCSS = function(cssString){ 
    var el = document.createElement("span"); 
    el.setAttribute("style", cssString); 

    return el.style; // CSSStyleDeclaration object 
}; 

var parsedStyle = parsedStyleForCSS("font: bold italic small-caps 1em/1.5em verdana,sans-serif"); 

console.log(parsedStyle["fontWeight"]); // bold 
console.log(parsedStyle["fontStyle"]); // italic 
console.log(parsedStyle["fontVariant"]); // small-caps 
console.log(parsedStyle["fontSize"]); // 1em 
console.log(parsedStyle["lineHeight"]); // 1.5em 
console.log(parsedStyle["fontFamily"]); // verdana, sans-serif 

Si usted está mirando para hacer algo similar con hojas de estilo completas, consulte esta respuesta: Parsing CSS in JavaScript/jQuery

Cuestiones relacionadas