Mantisのプラグインを作ってみる。(コメントへの画像貼り付け機能) その1

Mantisでソースコードを改造して作った画像貼り付け機能ですが、プラグインにしておいたほうが後でバージョンアップなどする際も楽かなと思いまして。
Mantis関連の記事一覧(Pluginを作成する手順等)

こちらを参考に自分の改造した部分をプラグイン化してみたいと思います。

mantisbt-plugins/bbcode
具体的な記述については同じようなことをやっているこのプラグインを参考にさせていただきます。

まずは、開発登録できるようにという事で基本的なことを。

name = 'ImagePasteOnComment';
    $this->description = 'CommentsでImageファイルをインラインに表示するPlugin';
    $this->page = '';         

    $this->version = '0.1';
    $this->requires = array(
      'MantisCore' => '1.2.0',
    );

    $this->author = 'Ryuji Ebine';
    $this->contact = 'rebine@redalarm.jp';
    $this->url = 'https://github.com/rebine/Mantis_ImagePasteOnComment';
  }

■hook設定
次に、hookのところですが、正直言って参考のリンクがすべて死んでいるので何を指定したらよいかわかりません。
bbcodeのところでは「EVENT_LAYOUT_RESOURCES 」なのでどういう定義なのか確認してみます。

[rebine@seedslight ImagePasteOnComment]$ fgrep -r EVENT_LAYOUT_RESOURCES ../../*
../../core/events_inc.php:      'EVENT_LAYOUT_RESOURCES' => EVENT_TYPE_OUTPUT,
../../core/html_api.php:        event_signal( 'EVENT_LAYOUT_RESOURCES' );
../../doc/en/developers.html:>EVENT_LAYOUT_RESOURCES (Output)</B
../../doc/en/developers.txt:     EVENT_LAYOUT_RESOURCES (Output)
../../docbook/developers/en/event-reference-output.sgml:                        <title>EVENT_LAYOUT_RESOURCES (Output)</title>

うーん。このdocbookっていうやつをみてみますかねー
なにやらMakefileがあるみたいで。

$ make html
echo -n $(LANG="en_US";date "+%e %B %Y") > builddate
jw -d ../../template/stylesheet.dsl#html -f docbook -b html -o build/developers developers.sgml
/bin/sh: jw: command not found
make: *** [build/developers/developers.html] Error 127

jwってなに?って思って調べたら、dockbook utilesに入っているようでした。
脱線していますけれど、下記のようにインストールしています。

# yum install docbook-utils
(略)

Resolving Dependencies
--> Running transaction check
---> Package docbook-utils.noarch 0:0.6.14-25.el6 will be installed
--> Processing Dependency: perl-SGMLSpm >= 1.03ii for package: docbook-utils-0.6.14-25.el6.noarch
--> Processing Dependency: docbook-style-dsssl >= 1.72 for package: docbook-utils-0.6.14-25.el6.noarch
--> Processing Dependency: text-www-browser for package: docbook-utils-0.6.14-25.el6.noarch
--> Processing Dependency: docbook-dtds for package: docbook-utils-0.6.14-25.el6.noarch
--> Running transaction check
---> Package docbook-dtds.noarch 0:1.0-51.el6 will be installed
--> Processing Dependency: xml-common >= 0.6.3-24 for package: docbook-dtds-1.0-51.el6.noarch
--> Processing Dependency: sgml-common >= 0.6.3-4 for package: docbook-dtds-1.0-51.el6.noarch
---> Package docbook-style-dsssl.noarch 0:1.79-10.el6 will be installed
--> Processing Dependency: openjade for package: docbook-style-dsssl-1.79-10.el6.noarch
---> Package lynx.x86_64 0:2.8.6-27.el6 will be installed
---> Package perl-SGMLSpm.noarch 0:1.03ii-21.el6 will be installed
--> Running transaction check
---> Package openjade.x86_64 0:1.3.2-36.el6 will be installed
--> Processing Dependency: libosp.so.5()(64bit) for package: openjade-1.3.2-36.el6.x86_64
---> Package sgml-common.noarch 0:0.6.3-33.el6 will be installed
---> Package xml-common.noarch 0:0.6.3-33.el6 will be installed
--> Running transaction check
---> Package opensp.x86_64 0:1.5.2-12.1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================
 Package                           Arch                 Version                      Repository          Size
==============================================================================================================
Installing:
 docbook-utils                     noarch               0.6.14-25.el6                base                69 k
Installing for dependencies:
 docbook-dtds                      noarch               1.0-51.el6                   base               274 k
 docbook-style-dsssl               noarch               1.79-10.el6                  base               277 k
 lynx                              x86_64               2.8.6-27.el6                 base               1.3 M
 openjade                          x86_64               1.3.2-36.el6                 base               817 k
 opensp                            x86_64               1.5.2-12.1.el6               base               872 k
 perl-SGMLSpm                      noarch               1.03ii-21.el6                base                26 k
 sgml-common                       noarch               0.6.3-33.el6                 base                43 k
 xml-common                        noarch               0.6.3-33.el6                 base                18 k

Transaction Summary
==============================================================================================================
Install       9 Package(s)

Total download size: 3.7 M
Installed size: 18 M

■ドキュメント作成

[rebine@seedslight en]$ make html
jw -d ../../template/stylesheet.dsl#html -f docbook -b html -o build/developers developers.sgml
Using catalogs: /etc/sgml/sgml-docbook-4.2-1.0-51.el6.cat
Using stylesheet: ../../template/stylesheet.dsl#html
Working on: ../../docbook/developers/en/developers.sgml
mkdir -p build/developers/images
cp images/* build/developers/images/
cp: cannot stat `images/*': No such file or directory
make: [build/developers/developers.html] Error 1 (ignored)
cp ../../template/stylesheet.css build/developers/

※上記ログはがっつりディレクトリ構造が出ていたので相対パスに書き直しています。

http://[インストールディレクトリ]/docbook/developers/en/build/developers/
これで見えました。

http://[インストールディレクトリ]/docbook/developers/en/build/developers/dev.plugins.building.html#DEV.PLUGINS.BUILDING.EVENTS
これにEventとhookのやり方が書いてあったりしました。

とりあえず、お目当てのイベントがどういう種類か?ってのが判らなかったので、referenceを検索して、Page Layoutのところで、「EVENT_LAYOUT_RESOURCES」を見つけました。

下記のイベントを見ると、僕の作りたいプラグインはコメントの中に画像を表示させたいので、「EVENT_LAYOUT_CONTENT_BEGIN」が良いような気がします。
もしかしたら、「EVENT_LAYOUT_CONTENT_END」こっちなのかもしれないですがー多分違うけれどキープっていう感じで記憶しておきます。

Page Layout
 
These events offer the chance to create output at points relevant to the overall page layout of MantisBT. Page headers, footers, stylesheets, and more can be created. Events listed below are in order of runtime execution.
 
EVENT_LAYOUT_RESOURCES (Output)
 
This event allows plugins to output HTML code from inside the <head> tag, for use with CSS, Javascript, RSS, or any other similary resources. Note that this event is signaled after all other CSS and Javascript resources are linked by MantisBT.
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_BODY_BEGIN (Output)
 
This event allows plugins to output HTML code immediatly after the <body> tag is opened, so that MantisBT may be integrated within another website's template, or other similar use.
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_PAGE_HEADER (Output)
 
This event allows plugins to output HTML code immediatly after the MantisBT header content, such as the logo image.
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_CONTENT_BEGIN (Output)
 
This event allows plugins to output HTML code after the top main menu, but before any page-specific content begins.
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_CONTENT_END (Output)
 
This event allows plugins to output HTML code after any page- specific content has completed, but before the bottom menu bar (or footer).
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_PAGE_FOOTER (Output)
 
This event allows plugins to output HTML code after the MantisBT version, copyright, and webmaster information, but before the query information.
 
Return Value
 
String: HTML code to output.
 
EVENT_LAYOUT_BODY_END (Output)
 
This event allows plugins to output HTML code immediatly before the </body> end tag, to so that MantisBT may be integrated within another website's template, or other similar use.
 
Return Value
 
String: HTML code to output.

とりあえず、hook()にEVENTを追加してみました。

  function hooks() {
    $hooks = parent::hooks();
    $hooks['EVENT_LAYOUT_CONTENT_BEGIN'] = 'string_process_image_link';
    return $hooks;
  }

2016-03-15_045223

ん??「EVENT_LAYOUT_CONTENT_BEGIN」が出ただけです。よく読むとメニューの後ぐらいのイベントみたいなので別のところにしたいと思います。
むしろ、お手本のbbcodeをみてみると、このhookでやっているのはCSSの読み込みくらいなので不要なのかもしれません。
(画像の枠についてはCSSを別にして読み込ませたいと思います)
続きます。

2016/3/17 追記
メソッドは書いたのに描画が変更されないなーおかしいなと思っていました。

  function hooks() {
//    $hooks = parent::hooks();
//    $hooks['EVENT_LAYOUT_CONTENT_BEGIN'] = 'string_process_image_link';
//    return $hooks;
  }

それはこのようにすべてのイベントのフックをやめていたからでした。

そもそも、「$hooks = parent::hooks();」この意味を正しく知らないまま書いているのでは?と思ったので、
ExtendしたClassの該当箇所を確認してみました。

core/classes/MantisFormattingPlugin.class.php
この中に定義されていました。

abstract class MantisFormattingPlugin extends MantisPlugin {

色々抜粋しますけれど、フックはこのように書いてあります。

        /**
         * Event hook declaration.
         */
        function hooks() {
                return array(
                        'EVENT_DISPLAY_TEXT'            => 'text',                      # Text String Display
                        'EVENT_DISPLAY_FORMATTED'       => 'formatted',         # Formatted String Display
                        'EVENT_DISPLAY_RSS'                     => 'rss',                       # RSS String Display
                        'EVENT_DISPLAY_EMAIL'           => 'email',                     # Email String Display
                );
        }

ああ。そうだったんだと改めて納得したところです。

で、よく考えてみると
class MantisCoreFormattingPlugin extends MantisFormattingPlugin {
これは同じClassを親に持っているわけですので、同じタイミングで同じメソッドを呼んでいるわけですよね?と。
オーバーライドを両方に行うってどんな処理?と思ったので、ログをいろいろ仕掛けたら面白かったのですが、
長くなるので他の記事に書きたいと思います。