案内編論文編書籍編雑記編

メディアウィキで使えるタグ要素を増やす方法

メディアウィキで、“q”要素を有効にして、インライン引用ができるようにしたり、“thead”“tbody”“tfoot”要素を有効にして、表の機能を高めたり、“img”要素を有効にして、独立表示されない画像を表示したり、“a”要素を有効にして、ブロック要素にリンクできるようにしたり、“abbr”要素を有効にして、略語表記ができるようにしたり、“embed”要素を有効にして、ユーチューブなどの動画を貼り付けることができるようにする方法。

1. 特定のタグ要素を有効にする

メディアウィキで、すべてのHTMLタグを有効にするには、“$wgRawHtml”を“true”に設定するとか、あるいは、それだと危険という場合には、“SecureHTML”のような拡張機能を導入するとよいでしょう。しかし、特定の要素だけを有効にしたいというだけなら、“Sanitizer.php”を修正する方法をお勧めします。このページでは、この方法により、以下の改良を試みます。

  1. “q”要素を有効にして、インライン引用ができるようにする。
  2. “thead”“tbody”“tfoot”要素を有効にして、表の機能を高める
  3. “img”要素を有効にして、独立表示されない画像を表示する。
  4. “a”要素を有効にして、ブロック要素にリンクできるようにする。
  5. “abbr”要素を有効にして、略語表記ができるようにする。
  6. “embed”要素を有効にして、動画の貼り付けを可能にする。

このためには、まずこれらの要素をホワイトリストに追加し、次にそれぞれに属性配置をセットアップします。

2. ホワイトリストへの要素の追加

インストールしたメディアウィキのフォルダ“includes”内にある“Sanitizer.php”を開きます。

../includes/Sanitizer.php

その中で、“static function removeHTMLtags”で検索して、その下にある以下の箇所を見つけます。

$htmlpairs = array_merge( $extratags, array( # Tags that must be closed
'b', 'del', 'i', 'ins', 'u', 'font', 'big', 'small', 'sub', 'sup', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'cite', 'code', 'em', 's',
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
'ruby', 'rt' , 'rb' , 'rp', 'p', 'span', 'u'
) );
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd'
);
$htmlsingleonly = array( # Elements that cannot have close tags
'br', 'hr'
);
$htmlnest = array( # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
'dl', 'font', 'big', 'small', 'sub', 'sup', 'span'
);
$tabletags = array( # Can only appear inside table, we will close them
'td', 'th', 'tr',
);
$htmllist = array( # Tags used by list
'ul','ol',
);
$listtags = array( # Tags that can appear in a list
'li',
);

以下のように、追加したい要素を加えます。

$htmlpairs = array_merge( $extratags, array( # Tags that must be closed
'b', 'del', 'i', 'ins', 'u', 'font', 'big', 'small', 'sub', 'sup', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'cite', 'code', 'em', 's',
'strike', 'strong', 'tt', 'var', 'div', 'center', 'abbr', 'q',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption',
'thead', 'tbody', 'tfoot', 'td', 'th', 'tr', 'a',
'pre','ruby', 'rt' , 'rb' , 'rp', 'p', 'span',
) );
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd', 'img', 'embed',
);
$htmlsingleonly = array( # Elements that cannot have close tags
'br', 'hr', 'img', 'embed',
);
$htmlnest = array( # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'q', 'blockquote', 'ol', 'ul',
'dl', 'font', 'big', 'small', 'sub', 'sup', 'span',
);
$tabletags = array( # Can only appear inside table, we will close them
'caption', 'thead', 'tbody', 'tfoot', 'td', 'th', 'tr',
);
$htmllist = array( # Tags used by list
'ul','ol',
);
$listtags = array( # Tags that can appear in a list
'li',
);

“big ”、“center ”、“font ”、“s ”、“strike ”、“tt ”、“u ”といった要素は、HTML5で廃止される予定[HTML5 differences from HTML4]なので、削除してもよいのですが、たんに使わなければよいだけの話なので、そのままにしておきましょう。

3. 属性配列のセットアップ

次に“static function setupAttributeWhitelist”で検索して、以下の箇所を見つけます。

$whitelist = array (
# 7.5.4
'div' => $block,
'center' => $common, # deprecated
'span' => $block, # ??

# 7.5.5
'h1' => $block,
'h2' => $block,
'h3' => $block,
'h4' => $block,
'h5' => $block,
'h6' => $block,

# 7.5.6
# address

# 8.2.4
# bdo

# 9.2.1
'em' => $common,
'strong' => $common,
'cite' => $common,
# dfn
'code' => $common,
# samp
# kbd
'var' => $common,
# abbr
# acronym

# 9.2.2
'blockquote' => array_merge( $common, array( 'cite' ) ),
# q

# 9.2.3
'sub' => $common,
'sup' => $common,

# 9.3.1
'p' => $block,

# 9.3.2
'br' => array( 'id', 'class', 'title', 'style', 'clear' ),

# 9.3.4
'pre' => array_merge( $common, array( 'width' ) ),

# 9.4
'ins' => array_merge( $common, array( 'cite', 'datetime' ) ),
'del' => array_merge( $common, array( 'cite', 'datetime' ) ),

# 10.2
'ul' => array_merge( $common, array( 'type' ) ),
'ol' => array_merge( $common, array( 'type', 'start' ) ),
'li' => array_merge( $common, array( 'type', 'value' ) ),

# 10.3
'dl' => $common,
'dd' => $common,
'dt' => $common,

# 11.2.1
'table' => array_merge( $common,
array( 'summary', 'width', 'border', 'frame',
'rules', 'cellspacing', 'cellpadding',
'align', 'bgcolor',
) ),

# 11.2.2
'caption' => array_merge( $common, array( 'align' ) ),

# 11.2.3
'thead' => array_merge( $common, $tablealign ),
'tfoot' => array_merge( $common, $tablealign ),
'tbody' => array_merge( $common, $tablealign ),

# 11.2.4
'colgroup' => array_merge( $common, array( 'span', 'width' ), $tablealign ),
'col' => array_merge( $common, array( 'span', 'width' ), $tablealign ),

# 11.2.5
'tr' => array_merge( $common, array( 'bgcolor' ), $tablealign ),

# 11.2.6
'td' => array_merge( $common, $tablecell, $tablealign ),
'th' => array_merge( $common, $tablecell, $tablealign ),

# 13.2
# Not usually allowed, but may be used for extension-style hooks
# such as <math> when it is rasterized
'img' => array_merge( $common, array( 'alt' ) ),

# 15.2.1
'tt' => $common,
'b' => $common,
'i' => $common,
'big' => $common,
'small' => $common,
'strike' => $common,
's' => $common,
'u' => $common,

# 15.2.2
'font' => array_merge( $common, array( 'size', 'color', 'face' ) ),
# basefont

# 15.3
'hr' => array_merge( $common, array( 'noshade', 'size', 'width' ) ),

# XHTML Ruby annotation text module, simple ruby only.
# http://www.w3c.org/TR/ruby/
'ruby' => $common,
# rbc
# rtc
'rb' => $common,
'rt' => $common, #array_merge( $common, array( 'rbspan' ) ),
'rp' => $common,

# MathML root element, where used for extensions
# 'title' may not be 100% valid here; it's XHTML
# http://www.w3.org/TR/REC-MathML/
'math' => array( 'class', 'style', 'id', 'title' ),
);
return $whitelist;
}

“a”“img”“thead”“tbody”“tfoot”の属性指定はすでにあるので、あとは、“abbr”と“q”をコメントアウトし、“embed”は新規に追加し、以下のように属性配置してください。

$whitelist = array (
# 7.5.4
'div' => $block,
'center' => $common, # deprecated
'span' => $block, # ??

# 7.5.5
'h1' => $block,
'h2' => $block,
'h3' => $block,
'h4' => $block,
'h5' => $block,
'h6' => $block,

# 7.5.6
# address

# 8.2.4
# bdo

# 9.2.1
'em' => $common,
'strong' => $common,
'cite' => $common,
# dfn
'code' => $common,
# samp
# kbd
'var' => $common,
'abbr' => $common,
# acronym

# 9.2.2
'blockquote' => array_merge( $common, array( 'cite' ) ),
'q' => array_merge( $common, array( 'cite' ) ),

# 9.2.3
'sub' => $common,
'sup' => $common,

# 9.3.1
'p' => $block,

# 9.3.2
'br' => array( 'id', 'class', 'title', 'style', 'clear' ),

# 9.3.4
'pre' => array_merge( $common, array( 'width' ) ),

# 9.4
'ins' => array_merge( $common, array( 'cite', 'datetime' ) ),
'del' => array_merge( $common, array( 'cite', 'datetime' ) ),

# 10.2
'ul' => array_merge( $common, array( 'type' ) ),
'ol' => array_merge( $common, array( 'type', 'start' ) ),
'li' => array_merge( $common, array( 'type', 'value' ) ),

# 10.3
'dl' => $common,
'dd' => $common,
'dt' => $common,

# 11.2.1
'table' => array_merge( $common,
array( 'summary', 'width', 'border', 'frame',
'rules', 'cellspacing', 'cellpadding',
'align', 'bgcolor',
) ),

# 11.2.2
'caption' => array_merge( $common, array( 'align' ) ),

# 11.2.3
'thead' => array_merge( $common, $tablealign ),
'tfoot' => array_merge( $common, $tablealign ),
'tbody' => array_merge( $common, $tablealign ),

# 11.2.4
'colgroup' => array_merge( $common, array( 'span', 'width' ), $tablealign ),
'col' => array_merge( $common, array( 'span', 'width' ), $tablealign ),

# 11.2.5
'tr' => array_merge( $common, array( 'bgcolor' ), $tablealign ),

# 11.2.6
'td' => array_merge( $common, $tablecell, $tablealign ),
'th' => array_merge( $common, $tablecell, $tablealign ),

# 13.2
# Not usually allowed, but may be used for extension-style hooks
# such as <math> when it is rasterized
'img' => array_merge( $common, array( 'alt' ) ),

# 15.2.1
'tt' => $common,
'b' => $common,
'i' => $common,
'big' => $common,
'small' => $common,
'strike' => $common,
's' => $common,
'u' => $common,

# 15.2.2
'font' => array_merge( $common, array( 'size', 'color', 'face' ) ),
# basefont

# 15.3
'hr' => array_merge( $common, array( 'noshade', 'size', 'width' ) ),
'embed' => array( 'style', 'id', 'type', 'src', 'width', 'height' ),

# XHTML Ruby annotation text module, simple ruby only.
# http://www.w3c.org/TR/ruby/
'ruby' => $common,
# rbc
# rtc
'rb' => $common,
'rt' => $common, #array_merge( $common, array( 'rbspan' ) ),
'rp' => $common,

# MathML root element, where used for extensions
# 'title' may not be 100% valid here; it's XHTML
# http://www.w3.org/TR/REC-MathML/
'math' => array( 'class', 'style', 'id', 'title' ),
);
return $whitelist;
}

[投稿者:永井俊哉]
ブログ内移動
カテゴリー内移動
お知らせ

このページでのコメントの受付は終了しました。本ページに関して、御意見、御質問、御批判をお持ちの方で、私に回答を求める方は、システム論フォーラムに投稿してください。

Sponsored Links
Books