2011-04-11 10 views
9

मुझे सीएसएस फ़ॉन्ट शॉर्टेंड प्रारूप को अलग-अलग घटकों (फ़ॉन्ट-फ़ैमिली, फ़ॉन्ट-साइज, फ़ॉन्ट-वेट, ...) में पार्स करने की आवश्यकता है। यह शॉर्टेंड प्रारूप बहुत जटिल दिखता है। यहां दो उदाहरण हैं:सीएसएस फ़ॉन्ट शॉर्टेंड प्रारूप का विश्लेषण कैसे करें

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

इससे पहले कि मैं इसके लिए एक पार्सर लेखन शुरू, वहाँ पहले से मौजूद पार्सर मैं इस्तेमाल कर सकते हैं (अधिमानतः जावास्क्रिप्ट में लिखा) है?

+2

क्यों आप ऐसा करने की जरूरत है? ब्राउजर में एक पार्सर बनाया गया है जो ऐसा करता है - क्या आपके 'फ़ॉन्ट' प्रॉपर्टी स्ट्रिंग को अस्थायी तत्व पर लागू करना और अलग-अलग गुणों को पढ़ना आसान नहीं होगा? – thirtydot

+0

मैं थर्डॉट से सहमत हूं, आप डेवलपर टूल या फायरबग से पार्स किए गए सीएसएस की प्रतिलिपि भी बना सकते हैं। –

+1

मैंने इसके बारे में सोचा लेकिन यह काम नहीं करता है। "फ़ॉन्ट" सेट करते समय फ़ॉन्ट्स और फ़ॉन्ट जैसे अन्य गुण अभी भी खाली हैं। शायद यह आपके ब्राउज़र में काम करता है, मेरा क्रोम इसका समर्थन नहीं करता है। – kayahr

उत्तर

11

यहाँ एक "अस्थायी डोम तत्व और jQuery के सीएसएस() फ़ंक्शन का उपयोग कर" समाधान है:

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

[मुझे लगता है कि आप पाएंगे] (http://jsfiddle.net/Mzrmd/) 'body' तत्व '$ test' अंक (आपका उदाहरण' body' तत्व को हटा देता है)। आप 'var $ test = $ ('') चाहते हैं .appendTo ('body')'। :) – alex

+0

@alex: धन्यवाद, आप बिल्कुल सही हैं। मुझे उलझन में आया :( – thirtydot

+1

Fyi, काम करने के लिए DOM ('.appendTo ('body') 'पहली पंक्ति के भाग' में '$ test' तत्व डालना आवश्यक नहीं है) और इसलिए आप अब '$ test.remove() 'कथन की आवश्यकता नहीं है। कोई बड़ा सौदा नहीं, थोड़ा सा क्लीनर और शायद एक बहुत छोटा प्रदर्शन लाभ। –

5

यहाँ एक फ़ॉन्ट पार्सर समारोह के अपने ही विनम्र कोशिश है मैं तो बस बनाया था। लेकिन मुझे यकीन नहीं है कि यह फ़ॉन्ट शॉर्ट हैंड प्रारूप की सभी विशेषताओं के साथ काम करता है।

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, मान्य इनपुट दिए गए कुछ त्वरित परीक्षणों के साथ ठीक लगता है। – thirtydot

3

शुद्ध मुक्त दूरी जावास्क्रिप्ट संस्करण:

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 

आप पूरा स्टाइलशीट के साथ इसी तरह कुछ करने के लिए देख रहे हैं, इस सवाल का जवाब देखें: Parsing CSS in JavaScript/jQuery

संबंधित मुद्दे