キャメルケースリンクとは,アルファベットで記述された単語のうち,大文字から始まり小文字で続く文字列が複数個連結された文字列を自動的に意味のある単語と認識してリンクを生成する機能です.例えば,
aaaa,aaaA,aaAa,aaAA,aAaa,aAaA,aAAa,aAAA
Aaaa,AaaA,AaAa,AaAA,AAaa,AAaA,AAAa,AAAA
のような16パターンを考えると,このうち,AaAaのみにリンクが自動生成されます.もしAaAaという名前のページが存在しない場合,新規ページの作成を促すために,
aaaa,aaaA,aaAa,aaAA,aAaa,aAaA,aAAa,aAAA
Aaaa,AaaA,AaAa?,AaAA,AAaa,AAaA,AAAa,AAAA
のように,強調表示された上に,"?"記号が付加されます.
たとえば,MechMoodleという単語が文章中に存在すると,これは”説明の必要がありそうな単語だ”と判断してくれることで,用語の説明を忘れずに済むというメリットはあるのですが,ソースリストの変数名の記述にこのスタイルは頻出するので,ソースリストをWiki中に示した場合は,かなり目障りです.
Wikiの設定の中に,”Wikiオートリンクオプション”として,”キャメリケースリンクを無効にする”というチェックボックスがあります.このチェックをONにすることでキャメルケースリンクは無効化されます.
ところが,キャメルケースリンクを無効にすると,副作用が生じることが分かってきました.キャメリケースリンクが有効な状態ではリンクが自動生成されない"++"が,無効にすると勝手にリンク生成されてしまいます.たとえば,
for ($i = 0; $i < 100; $i++)
というソースコードあった場合,キャメルケースリンクが有効な場合はそのまま表示されるのですが,無効にすると,
for ($i = 0; $i < 100; $i++?)
このように++が強調表示され,さらにその後ろに"?"記号が追加されます.
当初,この現象はキャメルケースリンクが有効でも発生するものだろうと考えていました.[ ]で単語を括るとWikiページのリンクが生成されるのと同様に,++には何か意味がある(例えば +もじもじ+ とすると何か意味があるなど)のかと.しかしどうやらこれはバグのような予感がします.
キャメルケースリンクを無効にすると,wiki/ewiki/ewiki.phpの頭のところで,
if ($moodle_disable_camel_case) {
define("EWIKI_CHARS_L", "");
define("EWIKI_CHARS_U", "");
}
else {
#### END MOODLE CHANGES
define("EWIKI_CHARS_L", "a-z_??$\337-\377");
define("EWIKI_CHARS_U", "A-Z0-9\300-\336");
#### BEGIN MOODLE CHANGES
}
というコードでEWIKI_CHARS_LとEWIKI_CHARS_Uを空にします.
これらの定数は,たとえばfunction ewiki_render_wiki_links()関数などで用いられる
$link_regex = &$ewiki_config["wiki_link_regex"];
$o = preg_replace_callback($link_regex, "ewiki_link_regex_callback", $o);
preg_replace_callback()組込関数のコールバック関数ewiki_link_regex_callback()を呼ぶ際に用いられます.$lewiki_config["wiki_link_regex"]は,
"wiki_link_regex" => "\007 [!~]?(
\#?\[[^<>\[\]\n]+\] |
\^[-".EWIKI_CHARS_U.EWIKI_CHARS_L."]{3,} |
\b([\w]{3,}:)*([".EWIKI_CHARS_U."]+[".EWIKI_CHARS_L."]+){2,}\#?[\w\d]* |
([a-z]{2,9}://|mailto:)[^\s\[\]\'\"\)\,<]+ |
\w[-_.+\w]+@(\w[-_\w]+[.])+\w{2,} ) \007x",
と定義されています.私には意味不明です.
また,以下のように使われている箇所もあります.
$value = preg_replace_callback("/((\w+:)?([".EWIKI_CHARS_U."]+[".EWIKI_CHARS_L."]+){2,}[\w\d]*)/", "ewiki_link_regex_callback", $value);
共通するのは,([".EWIKI_CHARS_U."]+[".EWIKI_CHARS_L."]+)という表現です.そこでPerl互換正規表現に詳しい方に質問です.もしEWIKI_CHARS_U/Lが共に空の場合,この正規表現パターンは,([]+[]+)となります.これが"++"に反応してしまうということはあり得るのでしょうか? PHPの実装(当方はWindows)によるバグで,Linuxでは発生しないという可能性もあります.
いま,Linux上で動作しているMoodle1.7では上記現象が発生しないことを確認しました.Moodle1.8で発生する問題か,あるいはWindowsをサーバとする場合のみ発生する問題か,あるいは当方の改造したfs_moodle1.8.3+でのみ発生する問題か?
- Linux上で動作するMoodle1.8で++がオートリンクされるか.
- Windows上で動作する(無改造の)Moodle1.8で++がオートリンクされるか.
いずれかをチェックし,報告して頂けると助かります.
#また私の空騒ぎの可能性が出てきてしまいましたが...
#本文中の正規表現の中で3箇所,:)があります.そのままですとフェイスマークになってしまうので,:を全角に変えてあります.