2009-08-13 7 views
8

कई ईमेल क्लाइंट लिंक किए गए सीएसएस स्टाइलशीट, या यहां तक ​​कि एम्बेडेड <style> टैग पसंद नहीं करते हैं, बल्कि चाहते हैं कि सीएसएस आपके सभी मार्कअप पर शैली विशेषताओं के रूप में इनलाइन दिखाई दे।पर्ल का उपयोग करके, इनलाइन शैली विशेषताओं में फ़ाइलों में सीएसएस परिभाषाओं को कैसे विलय कर सकता हूं?

  • खराब: <link rel=stylesheet type="text/css" href="/style.css">
  • खराब: <style type="text/css">...</style>
  • काम करता है: <h1 style="margin: 0">...</h1>

हालांकि इस इनलाइन शैली विशेषता दृष्टिकोण प्रबंधन के लिए एक सही दर्द है।

मुझे रूबी और PHP के लिए टूल मिल गए हैं जो एक सीएसएस फ़ाइल और इनपुट के रूप में कुछ अलग मार्कअप लेंगे और आपको मर्ज किए गए परिणाम लौटाएंगे - सभी सीएसएस के साथ मार्कअप की एक फ़ाइल शैली विशेषताओं में परिवर्तित हो जाएगी।

मैं इस समस्या का एक पर्ल समाधान ढूंढ रहा हूं, लेकिन मुझे सीपीएएन पर या Google को खोजकर नहीं मिला है। कोई संकेतक? वैकल्पिक रूप से, क्या सीपीएएन मॉड्यूल एक ही परिणाम प्राप्त करने के लिए गठबंधन कर सकते हैं?

+0

कोड मैं फ़ाइलों को मैं था का एक समूह पर काम किया तैनात @mintywalker, वैध उत्पादन किया वैध एचटीएमएल से एचटीएमएल और मान्य सीएसएस से वैध सीएसएस लग रहा है। या तुमने कोशिश की? कुछ प्रतिक्रिया होना बहुत अच्छा होगा। –

+0

@Sinan Ünür: हाँ - यह निश्चित रूप से चलता है और बहुत करीब आता है, लेकिन मैंने कुछ ऐसा देखा जो आपके उत्तर पर टिप्पणी करके सही नहीं हो रहा है - यह सीएसएस :: डोम समस्या है, न कि आपके। और टिप्पणियों के अनुयायियों पर पूर्वावलोकन करने की कमी टिप्पणी को उलझ गया, लेकिन मुझे लगता है कि आपको क्रूक्स को समझने में सक्षम होना चाहिए। आपकी मदद के लिए बहुत बहुत धन्यवाद, मुझे सीएसएस :: डोम के साथ एक खेल होगा, लेकिन मुझे डर है कि जटिलता मेरे यहां से हो सकती है। – mintywalker

+0

'एचटीएमएल :: ट्रीबिल्डर' और 'सीएसएस' के लिए यह आसान हो सकता है। मैं थोड़ा प्रयोग कर रहा हूँ। –

उत्तर

10

मुझे एक पूर्ण, पूर्व-पैक समाधान का पता नहीं है।

CSS::DOM के compute_style काफी emogrifier रूप में एक ही चेतावनियां ऊपर के अधीन है। HTML::TokeParser के संयोजन के साथ उस मॉड्यूल को कुछ पकाए जाने के लिए उपयोग करने योग्य होना चाहिए।

अद्यतन: यहाँ चीजों के एक गाड़ी mish मैश है:

#!/usr/bin/perl 

use strict; 
use warnings; 

use CSS::DOM; 
use File::Slurp; 
use HTML::DOM; 
use HTML::TokeParser; 

die "convert html_file css_file" unless @ARGV == 2; 
my ($html_file, $css_file) = @ARGV; 

my $html_parser = HTML::TokeParser->new($html_file) 
    or die "Cannot open '$html_file': $!"; 

my $sheet = CSS::DOM::parse(scalar read_file $css_file); 

while (my $token = $html_parser->get_token) { 
    my $type = $token->[0]; 
    my $text = $type eq 'T' ? $token->[1] : $token->[-1]; 
    if ($type eq 'S') { 
     unless (skip($token->[1])) { 
      $text = insert_computed_style($sheet, $token); 
     } 
    } 
    print $text; 
} 

sub insert_computed_style { 
    my ($sheet, $token) = @_; 
    my ($tag, $attr, $attrseq) = @$token[1 .. 3]; 
    my $doc = HTML::DOM->new; 

    my $element = $doc->createElement($tag); 

    for my $attr_name (@$attrseq) { 
     $element->setAttribute($attr_name, $attr->{$attr_name}); 
    } 

    my $style = CSS::DOM::compute_style(
     element => $element, user_sheet => $sheet 
    ); 

    my @attrseq = (style => grep { lc $_ ne 'style' } @$attrseq); 
    $attr->{style} = $style->cssText; 

    my $text .= join(" ", 
     "<$tag", 
     map{ qq/$_='$attr->{$_}'/ } @attrseq); 
    $text .= '>'; 

    return $text; 
} 

sub skip { 
    my ($tag) = @_; 
    $tag = lc $tag; 
    return 1 if $tag =~ /^(?:h(?:ead|tml)|link|meta|script|title)$/; 
} 
+0

धन्यवाद - यह बहुत आश्चर्यजनक है, हालांकि मुझे लगता है कि सीएसएस :: डोम (जो थोड़ा सा नाजुक दिखता है!) के साथ एक बग/टोडो है जो स्कूपर चीजें थोड़ा # फ़ू {सीमा-चौड़ाई: 2 पीएक्स} div {बॉर्डर: 1px हरी धराशायी} एचटीएमएल < div id के साथ = foo > ... </div > पाने के लिए चाहिए शैली = 'बॉर्डर: 1px हरी धराशायी; सीमा-चौड़ाई: 2 पीएक्स; ' लेकिन वर्तमान में शैली = 'सीमा-चौड़ाई: 2px; सीमा: 1 पीएक्स डैश हरा ' – mintywalker

+0

@mintywalker यह एक समस्या है। मैंने 'compute_style' के स्रोत को देखा है और मुझे यकीन नहीं है कि मैं अभी इसे ठीक कर सकता हूं। एक क्लूडी फिक्स सीएसएस फ़ाइल में ऑर्डर बदलने के लिए है: div {border: 1px dashed green} #foo {सीमा-चौड़ाई: 8px} लेकिन यह सामान्य मामले में व्यावहारिक नहीं है। –

+0

मेरे पास सीएसएस :: डोम के साथ एक खेल होगा - मेरे उद्देश्यों के लिए, एक अपवाद स्पॉटिंग और फेंकना गलत था जो कुछ गलत करने से बेहतर होगा, इसलिए मुझे आश्चर्य है कि क्या मैं उस दिशा में compute_style को ट्विक करने में सक्षम हो सकता हूं कम से कम। अगर मैं कहीं भी मिलता हूं (जो बिल्कुल गारंटी नहीं है!) फिर से - बहुत धन्यवाद, यह एक बहुत ही उपयोगी शुरुआत है। – mintywalker

4

आप उपयोग कर सकते हैं CSS::Inlinerhttp://search.cpan.org/dist/CSS-Inliner/

+0

मैंने हाल ही में इस समस्या में भी भाग लिया है। सीएसएस :: इनलाइनर बिल्कुल मेरे लिए उपकरण की तरह दिखता है। मैं अपने टेम्पलेट्स को सीएसएस नियमों का उपयोग करना चाहता हूं, लेकिन ईमेल भेजने से ठीक पहले शैलियों को रेखांकित करना चाहता हूं। लिंक के लिए धन्यवाद! –

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

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