HTML5 の DOCTYPE 宣言を出力できるようにする

  • ページ: BugTrack2
  • 投稿者: bee
  • 優先順位: 普通
  • 状態: 完了
  • カテゴリー: 本体新機能
  • 投稿日: 2016-10-14 (金) 08:52:12
  • バージョン: 1.5.1
  • リリース予定バージョン: 1.5.2

メッセージ

関連: BugTrack2/387

かなり場当たり感が目立っていますが、まずは機能を追加して、次にデフォルト引数を変更、最終的にガラッとリファクタリングできればいいかなと思っています。

osdn.net/users/beec1e/pf/pukiwiki/ にコードを置いてあります。

適用しづらそうなので git format-patch で分割したものを用意しました。
xrea.beecle.net/pukiwiki/?Patch/BugTrack2-389

一応 UnitTest も書いてみました(PHPUnit 4.8 なので PHP 5.3 以降限定ですが…)。
PHP 5.3 以降で Regression していることはないはず。
travis-ci.org/beec1e/pukiwiki/builds/167510623

patch

diff --git a/lib/html.php b/lib/html.php
index 6b2fc6c..274dca8 100644
--- a/lib/html.php
+++ b/lib/html.php
@@ -526,6 +526,7 @@ function pkwk_common_headers()
 }

 // DTD definitions
+define('PKWK_DOCTYPE_HTML5',              28);
 define('PKWK_DTD_XHTML_1_1',              17); // Strict only
 define('PKWK_DTD_XHTML_1_0',              16); // Strict
 define('PKWK_DTD_XHTML_1_0_STRICT',       16);
@@ -575,6 +575,9 @@ function pkwk_output_dtd($pkwk_dtd = PKWK_DTD_XHTML_1_1, $charset = CONTENT_CHAR
                $option  = 'Transitional';
                $dtd     = 'http:// www.w3.org/TR/html4/loose.dtd';
                break;
+       case PKWK_DOCTYPE_HTML5:
+               $type    = PKWK_DTD_TYPE_HTML;
+               break;

        default: die('DTD not specified or invalid DTD');
                break;
@@ -586,13 +589,17 @@ function pkwk_output_dtd($pkwk_dtd = PKWK_DTD_XHTML_1_1, $charset = CONTENT_CHAR
        if ($type == PKWK_DTD_TYPE_XHTML) echo '<?xml version="1.0" encoding="' . $charset . '" ?>' . "\n";

        // Output doctype
-       echo '<!DOCTYPE html PUBLIC "-//W3C//DTD ' .
-               ($type == PKWK_DTD_TYPE_XHTML ? 'XHTML' : 'HTML') . ' ' .
-               $version .
-               ($option != '' ? ' ' . $option : '') .
-               '//EN" "' .
-               $dtd .
-               '">' . "\n";
+       if ($pkwk_dtd == PKWK_DOCTYPE_HTML5) {
+               echo "<!DOCTYPE html>\n";
+       } else {
+               echo '<!DOCTYPE html PUBLIC "-//W3C//DTD ' .
+                       ($type == PKWK_DTD_TYPE_XHTML ? 'XHTML' : 'HTML') . ' ' .
+                       $version .
+                       ($option != '' ? ' ' . $option : '') .
+                       '//EN" "' .
+                       $dtd .
+                       '">' . "\n";
+       }
        // Output <html> start tag
        echo '<html';
@@ -609,6 +616,8 @@ function pkwk_output_dtd($pkwk_dtd = PKWK_DTD_XHTML_1_1, $charset = CONTENT_CHAR
        if ($type == PKWK_DTD_TYPE_XHTML) {
                // NOTE: XHTML 1.1 browser will ignore http-equiv
                return '<meta http-equiv="content-type" content="application/xhtml+xml; charset=' . $charset . '" />' . "\n";
+       } elseif ($pkwk_dtd == PKWK_DOCTYPE_HTML5) {
+               return '<meta charset="' . $charset . '" />' . "\n";
        } else {
                return '<meta http-equiv="content-type" content="text/html; charset=' . $charset . '" />' . "\n";
        }

  • 実装ありがとうございます。テストがあるのが良いですね!この変更を取り込んでさらにskinからも消してしまいます -- umorigu 2016-10-20 (木) 05:42:19
  • すみません。前言撤回です。一度パッチを取り込んでみたのですが、結局metaヘッダも変更になってしまうので(Content-Style-Type / Content-Script-Type削除)、DTD選択機能ごと削除しました osdn.net:projects/pukiwiki/scm/git/pukiwiki/commits/dc10e467307721d15ecc5ae485582af32aa7d64e -- umorigu 2016-11-15 (火) 08:24:08
  • それでいいと思います。 -- bee 2016-11-16 (水) 00:38:04
    • が、<meta http-equiv="Content-Type" ... /> ではなく <meta charset="$charset" /> のほうが HTML5 っぽいような。 -- bee 2016-11-16 (水) 00:40:09
    • <meta charset="utf-8"> は古いブラウザで解釈できないので意図して<meta http-equiv= ...>を使っています -- umorigu 2016-11-18 (金) 00:48:15
      • 了解しました。古いブラウザは Content-Type ヘッダーで判断してもらえると嬉しいんですけどね…。 -- bee 2016-11-19 (土) 19:04:30
    • Webサーバー上のコンテンツを見る場合はHTTPのContent-Typeヘッダーが優先されて問題にならないはずです。問題になるのは一度ファイル保存してローカルファイルをブラウザで閲覧するような場合ですね。 -- umorigu 2016-11-19 (土) 22:27:56
  • 関連: BugTrack/768 -- bee 2016-11-16 (水) 00:54:54
  • 自分でテーマを書いていて気付いたのですが、<html lang="ja"> より <html lang="<?php echo LANG ?>"> のほうが嬉しいですね(細かいところをネチネチ言ってすみません) -- bee 2016-11-19 (土) 19:03:05
    • 鋭いですね。ここは悩んだところなのですが、今私が運用しているサイトが LANG='en' でメニューは英語にした上で、ページコンテンツはほぼ日本語なのです。この場合おそらく<html lang="ja">が適切と思われます。PukiWiki利用は日本語が圧倒的に多いと思っているので、標準スキンは<html lang="ja>にして、<html lang="<?php echo LANG ?>を使うかどうかはカスタムスキン(スキン作者)側の実装に任せようと思いました -- umorigu 2016-11-19 (土) 19:32:14
    • あるいは、lang属性無くした方が潔いのかも... -- umorigu 2016-11-19 (土) 19:37:55
      • しかしlangを無くすと"ja"の情報がどこにもなくなってしまうので、ブラウザが言語判定に失敗して中国語フォントが表示に使われてしまったりするのを懸念しています -- umorigu 2016-11-19 (土) 20:19:41
    • この BugTrack の範疇を超えた多言語対応の問題ですね…。
      Workaroud としては CONTENTS_LANG を pukiwiki.ini.php で設定できるようにして pukiwiki.skin.php で if (! defined(CONTENTS_LANG)) { define('CONTENTS_LANG', LANG); } して <html lang="<?= CONTENTS_LANG?>"> に持っていくとか? -- bee 2016-11-19 (土) 21:10:35
    • 既存のカスタムスキンは output_dtd() を使うか勝手に LANG を参照しているので、CONTENTS_LANG が設定されてなくても困らない、はず。 -- bee 2016-11-19 (土) 21:14:58
    • すでに UI_LANG もあるんですが、こっちを使うのはたぶん大工事になってしまうので…。 -- bee 2016-11-19 (土) 21:20:28
      • 本当は UI_LANG に 'en'、LANG に 'ja' を入れて umorigu さんの使い方ができればそれが最良だと思います。 -- bee 2016-11-19 (土) 21:24:50
      • いや、UI_LANG = 'en' でメニューだけ英語可能みたいです。間違った情報を掲載してゴメンナサイ。 -- bee 2016-11-19 (土) 21:40:57
      • でもディレクトリが別だから LANG='en' から LANG='ja', UI_LANG='en' にしようとするとコンバート作業が必要ですね…。 -- bee 2016-11-19 (土) 21:52:06
      • なお、 wiki.en/ にあるファイルは英語版の「デフォルトコンテンツ」なので扱いがまた異なります -- umorigu 2016-11-19 (土) 22:12:45
    • 本当ですね。UI_LANG: 'en'、LANG: 'ja' でメニューだけ英語にできました。確かにこれなら <html lang="<?php echo LANG ?>"> でよさそうです -- umorigu 2016-11-19 (土) 22:09:51
    • lang属性についてのご指摘に対応しました。 osdn.net:projects/pukiwiki/scm/git/pukiwiki/commits/0ded331a84bbf7ff874510990601335024129829 どうもありがとうございます -- umorigu 2016-11-19 (土) 22:26:09


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-19 (土) 22:28:55
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.183 sec.

OSDN