Wiki本文の == がおかしなことになる

Wiki本文の == がおかしなことになる

- Tatsuya Shirai の投稿
返信数: 6

 ”++”の問題が収まって一安心し,a[]のような[]内に文字が存在しない場合のリンク抑制がa![]でOKになり,これでもうWikiは万全だ,と一安心していたところで,非常にイヤな現象が発生していることに気付きました.当方のMoodle1.8.3+(fs_moodle, Windows)だけでなく,Moodle1.7(Linux)でも同じ現象が発生しました.

 Wikiの編集ページで以下の文を入力し,保存して見てください.

if (a==b) { printf("Hello==World!\n"); }

以下のようになると思います.

if (ab) { printf("HelloWorld!\n"); }

問題は二つあり,まず "=="が消えています.それとそれ以降,文字が小さくなっています.これはHTMLソースコードで見てみると,

if (a<tt>b) { printf(&quot;Hello</tt>World!\n&quot;); }

このように,== が <tt>になっており,なぜか律儀に次に現れる == が </tt>になっています.

どういう==ことだ.

このように単体だと何も起きず,

どういう==ことだ.

どういう==ことだ.

段落が異なる場合も問題はないのですが,

どういう==ことだ.
どういう==ことだ.

同じ段落(IEを入力に用いています.Shift+改行)だと,

どういうことだ.
どういう
ことだ.

消えます.一行目の”ことだ.”から2行目の”どういう”までの文字サイズが小さくなっています.

 今までのWiki関係のエラーと根本的に異なるのは,これは編集画面で入力したはずの == を消し去ってしまう点です.いまからWikiのソースを直したからといっても,今までに入力し,消えていることに気付いていない == は,もう元には戻せません.

 ======== :8個の連続する空白は,<p><tt></tt><tt></tt></p>,このようになります.

なお,<tt></tt>は等幅フォントの指定です.


古いWikiへの書き込みを見ていて,この件を思い出しました.
すっかり忘れていました.
今回の修正ではこの問題は修正されません.もっと別の部分にあるエラーのようです.キャメルケースリンクの有効/無効とは関係ありません.フォーラムへの書き込みでも発生しない問題ですので,HTMLエディタよりもWikiが怪しいです.


Tatsuya Shirai への返信

Re: Wiki本文の == がおかしなことになる

- Tatsuya Shirai の投稿

mod/wiki/ewiki/ewiki.phpの230行あたりに,

#-- rendering ruleset
とあり,その先に,

"wm_style" => array(
       "'''''" => array("<b><i>", "</i></b>"),
        "'''" => array("<b>", "</b>"),
        "___" => array("<i><b>", "</b></i>"),
        "''" => array("<em>", "</em>"),
        "__" => array("<strong>", "</strong>"),
        "^^" => array("<sup>", "</sup>"),
        "==" => array("<tt>", "</tt>"),
    #<off># "***" => array("<b><i>", "</i></b>"),
    #<off># "###" => array("<big><b>", "</b></big>"),
        "**" => array("<b>", "</b>"),
        "##" => array("<big>", "</big>"),
        "??" => array("<small>", "</small>"),
           ),

こんなのがありますねぇ...

 ちなみに ## も消えますが,??はきえません.**は間に挟まった文字を強調します.

 うーん,HTMLエディタを使用していますので,これらの機能は全て消さないと危険です.そういえばソースコードの一部が強制的に斜体になったりと,奇妙な箇所がいくつかありましたが,これらの書式指定の埋め込みコマンドが悪さをしていたとは!
(もっと早く気付くべきでした)

Tatsuya Shirai への返信

Re: Wiki本文の == がおかしなことになる

- Tatsuya Shirai の投稿

 取り敢えず勝手に整形されるのを抑止しました.副作用は無いと思います.

 mod/wiki/ewiki/ewiki.phpのfunction ewiki_format(),1952行あたりに,

            #-- text style triggers
            foreach ($wm_style as $find=>$replace) {
               $find_len = strlen($find);
               $loop = 20;
               while(($loop--) && (($l = strpos($line, $find)) !== false) && ($r = strpos($line, $find, $l + $find_len))) {
                  $line = substr($line, 0, $l) . $replace[0] .
                          substr($line, $l + strlen($find), $r - $l - $find_len) .
                          $replace[1] . substr($line, $r + $find_len);
               }
            }

このようなブロックがあります.これをバッサリとコマントアウトすることで勝手に本文が改変されなくなりました.$wm_styleが先ほどの様々なテキストスタイルを指定する埋め込み文字列を発見して,置き換える箇所です.roffなどのイメージで考えるとごく自然だったのかも知れませんが...

 他にも色々と置換処理を行っているようで少し気になるのですが,まずは最も致命的な部分だけ対策を施しました.

Tatsuya Shirai への返信

Re: Wiki本文の == がおかしなことになる

- Mikio Ikeda の投稿

類似の問題としては、スマイリー(smileなど)を表示する機能にもあります。数式などでよく使用する記号列も含まれているので、TeXフィルタが正しく動作しない場合があります。四日市大学のサイトでは、smily 検出パターンを変えて対処しました。

Moodle にはHTMLエディタやWikiも含めていろいろな機能が、別のものから取り込まれているので、それらの機能間の調整ができていない部分が多々あると思います。

Mikio Ikeda への返信

Re: Wiki本文の == がおかしなことになる

- Tatsuya Shirai の投稿

 むむ,そうですね.

 そういえばソースリストの一部だったか,スマイリーが出て困ったことがあります.
 でも,スマイリーは非常に重要な機能ですから消すわけにはいきません.

 <PRE></PRE>(が妥当かどうかは分かりませんが)のようなタグで,「ここからここは余計なことをしないでね!」と指定できる機能が必要ですね.


 あまり頑張って改善を行っても,HTMLareaもWikiもこの先,どうなるか分からない,と思うと気が重いですね.特に,WikiはNWikiに変わることを前提としているので(ズルズルと),メンテナンスは進まないし,明白なケアレスミスのバグフィクスもTrackerでコメントすら付きません.NWikiも素晴らしいのだと思うのですが,しばらくはewikiとの並存をしてくれないと困りますね.


 ちなみに,四日市大学さんでは,smily検出パターンをどのように変更したのですか?


 しかし,== と==で括った場合はホニャララ,という処理を行うのは別に悪いことだとは思わないのですが,Web表示時に細工をするだけにして,ソースを修正するのは止めて欲しかった...こんな野蛮な文化は他に目にしたこと無いです.

Tatsuya Shirai への返信

Re: Wiki本文の == がおかしなことになる

- Mikio Ikeda の投稿
lib/filelib.php の (h),(heart),(y),(n),(martin),( ) をすべて[]で括り、
[(h)],[(heart)],[(y)],[(n)],[(martin)] としました。もう一ヶ所対応する場所があったような気がします。

これらの中で特に問題になりそうなのは、(h),(y),(n) ですね。実際に引っ掛かったのは、(n)です。x(n)のようにして、n 番めの x として使用したい部分ですね。

注:()はすべて全角の()に変更しました。

Mikio Ikeda への返信

Re: Wiki本文の == がおかしなことになる

- Tatsuya Shirai の投稿

lib/filelib.phpではなく,

lib/weblib.phpの中のfunction replace_smilies(&$text) でしょうか? martin

本当ですね 笑顔 これは困りますね.

http://moodle.org/mod/forum/discuss.php?d=57460#p261951

こちらにある内容ですね!(なんとなく見覚えがありましたが,池田先生から指摘があるまですっかり忘れておりました)


Smiliesが表示されなくなると寂しくなるなぁ,と思いながらも,吉田さんの示している修正を行ったところ,HTMLエディタから入力した笑顔などはきちんと表示されることを確認しました.

ソースを見てみると一目瞭然ですが,HTMLエディタから入力した場合は画像へのリンクでフェースマークを表示していますので,まったくメカニズムが異なる訳ですね.納得しました.

Wikiに対しても有効な対策のようですので,この旧式のスマイリー(と勝手に呼びます)に対する対策は上記URLの方法で問題無さそうです.

(ただ,他にも2箇所ほど,replace_smilies()を呼んでいる箇所がweblib.php内にあります.これらもコメントアウトして問題ない...ですよね?)


取り敢えずどのような影響があるのか(多分,無いでしょう)分からないですが,思い切って,

function replace_smilies(&$text) {

途中は全てコメントアウト.

}

としてみました.最初から,古いタイプのスマイリーは使わないのだ,と割り切れば,HTMLエディタから入力できない,martinだって,Yesだって,Noだって,キスだって,heartだって,諦められます 笑顔.(少し未練)