2010-04-19 8 views
4

Lorsque j'écris un plugin jQuery j'aime spécifier les options pour les espacements de la manière CSS. J'ai écrit une fonction qui renvoie une chaîne CSS en tant que valeurs dans un objet.analyse des mesures css

5px 10px rendements top: 5px, droite: 10px, en bas: 5px, à gauche: 10px

Maintenant j'utilise souvent les valeurs renvoyées pour faire des calculs et ce ne est pas très agréable d'avoir à extraire l'unité de mesure tous les temps ...

I suck par écrit des expressions régulières quelqu'un pourrait me aider à terminer cette fonction:

this.cssMeasure = function(cssString, separateUnits){ 

    if (cssString){ 
     var values = {} 
    }else{ 
     return errorMsg 
    } 

    var spacing = cssString.split(' ') 
    var errorMsg = 'please format your css values correctly dude' 

    if(spacing[4]) { 
     return errorMsg 
    } else if (spacing[3]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[3]} 
    } else if (spacing[2]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[1]} 
    } else if (spacing[1]) { 
     values = {top: spacing[0], right:spacing[1], bottom:spacing[0], left:spacing[1]} 
    } else { 
     values = {top: spacing[0], right:spacing[0], bottom:spacing[0], left:spacing[0]} 
    } 

    if (separateUnits) { 
     $.each(values, function(i, value){ 
      /* 
      at this place i need to extract the measuring unit of each value and return them separately 
      something like top: {value: 10, unit: 'px'}, right: {bla} and so on 
      */ 
     }) 
    } 

    return values 

} 

si vous avez une idée pour améliorer cette fonction, je suis ouvert à vos commentaires.

+1

Notez que donner trois valeurs (par exemple "10px 5px 7px") est parfaitement valide; la 1ère valeur est pour le haut, la 2ème pour la gauche et la droite, la 3ème pour le bas. – outis

+0

wow bon à savoir, j'ai édité le post. – meo

Répondre

4

Selon http://www.w3.org/TR/css3-values/#ltnumbergt « Un certain nombre peut être un nombre entier, ou il peut être suivie de zéro ou plusieurs chiffres par un point (.) Suivi d'un ou plusieurs chiffres », en langage regexp

\d+|\d*\.\d+ 

Ajoutons un signe facultatif, et rendre le groupe « non-capture » pour rendre l'analyse plus simple

([+-]?(?:\d+|\d*\.\d+)) 

Énumérer toutes les unités possibles est fastidieuse, donc laissez l'appareil une suite quelconque des lettres minuscules (y compris aucun) ou un pour cent signe

([a-z]*|%) 

Mettre tous ensemble,

propRe = /^([+-]?(?:\d+|\d*\.\d+))([a-z]*|%)$/ 

Lorsque vous appliquez cela à une valeur

parts = "+12.34em".match(propRe) 

la valeur numérique sera parties [1] et l'unité dans les parties [2]

2
switch (spacing.length) { 
case 1: 
    values = {top: spacing[0], right:spacing[0], bottom:spacing[0], left:spacing[0]}; 
    break; 
case 2: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[0], left:spacing[1]}; 
    break; 
case 3: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[1]}; 
    break; 
case 4: 
    values = {top: spacing[0], right:spacing[1], bottom:spacing[2], left:spacing[3]}; 
    break; 
default: 
    return errorMsg; 
} 

if (separateUnits) { 
    values = $.map(values, function(i, value){ 
     matches = value.match(/([-+]?[\d.]*)(.*)/); 
     return {value: matches[1]+0, 
       unit: matches[2] ? matches[2] : 'px'}; 
    }) 
} 
+0

la solution de cas est certainement mieux. Mais que se passe-t-il si l'unité n'est pas px mais em ou%? Et quel est le "?" doing (correspond [2]? matches [2]) – meo

+1

Le groupe d'unités '(. *)' correspondra à tous les caractères. En particulier, le premier groupe correspondra à tous les chiffres et les caractères restants seront l'unité. Le '?' N'est pas seul; cela fait partie de l'opérateur ternaire solitaire, '?:'. C'est comme un «si-autre», mais comme une expression plutôt qu'une déclaration. Il s'assure que la valeur a des unités valides; Si aucune unité n'a été spécifiée, les unités par défaut sont «px». Rechercher SO pour "ternaire" pour plus d'informations. – outis