M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2008年4月27日 23:05

CGI::Applicationで、IE6のときだけXML宣言を消すHTMLを生成する

このエントリーをはてなブックマークに追加 mixiチェック

Windows IE6は、XML宣言があると後方互換モードでレンダリングされる不具合があるので、標準準拠モードにするにはXML宣言を取っ払う必要がある。他のブラウザはそういう問題がないので、XML宣言つけておきたい。というときに、CGI::Applicationで、能動的にプラウザの種類によって吐き出すHTMLを変えてやろうという魂胆です。

CGI::Applicationでは、cgiapp_postrunで、吐き出す寸前のコンテンツを書き換えることが出来るので、ここで、ブラウザがIE6で、かつContent-Typeがtext/htmlの時だけ、XML宣言を取っ払うコードを書いておけばOK。

CGI::Application::Plugin::BrowserDetectが初めて役に立ちました。

#!/usr/bin/perl
package main;
my $webapp = WebApp->new();
$webapp->run();
 
 
package WebApp;
use base 'CGI::Application';
use strict;
use warnings;
use CGI::Application::Plugin::BrowserDetect;
 
 
sub cgiapp_postrun {
  my $self = shift;
  # WinIE6の時にXML宣言を外す
  my $output_ref = shift;
  my $b = $self->browser;
  if ( ({$self->header_props()}->{'-type'} eq 'text/html') &&
       ( ( $b->windows ) && ( $b->ie )
         && ( $b->major < 7 ) ) ) {
    $$output_ref =~s/<\?xml .+\?>\n?//so;
  }
}
 
 
sub setup {
  my $self = shift;
  $self->start_mode('start');
  $self->run_modes(
    start => 'start',
  );
  $self->header_add( -type => 'text/html',
                     -charset => 'UTF-8' );
}
 
 
sub start {
  my $self = shift;
  my $tmpl_html = << 'END_OF_HTML';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC 
  "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="ja" lang="ja">
  <head>
    <meta http-equiv="Content-Type"
      content="text/html; charset=UTF-8" />
    <title>test</title>
    <meta http-equiv="content-script-type"
      content="text/javascript" />
    <meta http-equiv="content-style-type"
      content="text/css" />
    <link rel="index" href="/" />
    <link rev="made" href="mailto:hoge@example.com" />
  </head>
  <body>
    <p>
      IE6だとXML宣言消えているよ。
    </p>
  </body>
</html>
END_OF_HTML
  my $t = $self->load_tmpl( \$tmpl_html );
  return $t->output;
}

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2453

コメントする