Jump to content

User:Funa-enpitu/Forum

From mediawiki.org

Forum.jsは、Funa-enpituが開発したMediaWiki用掲示板プログラムです。以下に示した最後の「common.js」を除く4つのファイル及びこのドキュメントはCC BY-SA 4.0でライセンスされています。「common.js」はパブリックドメインに置いています。

ファイル名 説明
installer.js インストーラ
Forum.js 本体
thread.lua スレッド一覧取得用モジュール
post.tpl 投稿のテンプレート
post-styles.css 投稿のスタイルシート
common.js WikiのCommon.jsに追加するコード

インストール・アップデート

[edit]
  1. あなたのウィキのあなたの利用者JSページに以下のインストールスクリプトを追加します。
    mw.loader.load('//www.mediawiki.org/w/index.php?title=User:Funa-enpitu/Forum/installer.js&action=raw&ctype=text/javascript');
    
  2. ページのキャッシュを破棄し(Shift + 再読み込み)、サイドバー(Vector 2022はツールタブ)内のツールボックスに「Install Forum.js」の項目が増えているので、そこをクリック。
  3. 手順に従って「次へ」を押していきます。
  4. インストール画面に遷移すると、上のファイルから順にインストールが始まっていきます。
    • 「状態」がすべて「Done」なら、インストールが完了しています。「掲示板に行く」を押して掲示板を使い始めることができます。
    • 「状態」に「Fail」が含まれる場合、インストールは失敗しています。「再試行」を押して再インストールしてください。

概要

[edit]

このスクリプトは昔作成した掲示板スクリプトBb.jsを一から書き直したものになります。Bb.jsとの相違点は以下の通り。

  • 投稿部分にWikiEditorを採用
  • プレビュー機能の追加
  • スレッド一覧に最終投稿者・日時、総投稿数などの情報を追加(Luaを使用)
  • スレッド一覧にSticky機能を追加
  • 返信された場合に通知を送信
  • 読み込み方式に変更(プログラムファイルがWiki内設置不要)
  • MediaWiki UI使用
  • IP投稿廃止 ver.1.5 対応しました
  • jQuery不使用(mwオブジェクトを介して実行されるもの以外)

WikiのCommon.jsに設置することを想定しています。

他の一般的な掲示板システムに付属している「ボード」機能は、規定では使うことができませんが、簡単に実装できます。#ボード機能の追加節の解説を参考にするといいです。

動作環境

[edit]

Forum.jsを利用するためには、以下の環境が必要になります。古いバージョンでもある程度動作すると思われますが、誤作動を引き起こす可能性があります。

また、返信機能を利用するためには$wgEchoMaxMentionsInEditSummaryを1以上に設定する必要があります。

設定

[edit]

すべての設定はmw.forumオブジェクトから読み込まれます。

キー 規定値 説明
toppage undefined 掲示板のトップページ。この設定は必須です。
sticky [] スティッキースレッド。配列に{title: '(スティッキーするスレッド名)'}のような連想配列を追加します。
threads '20' スレッド一覧に一度に表示するスレッドの数。
msg [object Object]
{loading: '<p>読み込み中...</p>',postform: '<div id="f-form"><h2>投稿</h2><div class="mw-ui-checkbox" style="margin-bottom:.3em;"><input type="checkbox" class="mw-ui-checkbox" id="f-reply-cb"><label for="f-reply-cb" style="user-select:none;">返信する</label></div><input type="number" id="f-reply" class="mw-ui-input" style="widht:50%;margin-bottom:.5em;"><textarea accesskey="," id="wpTextbox1" cols="80" rows="25" class="mw-editfont-monospace"></textarea><input type="button" id="f-post" value="投稿" class="mw-ui-button mw-ui-progressive" style="margin-top:.5em;"><input type="button" id="f-preview" value="プレビュー" class="mw-ui-button" style="margin: .5em 0 0 .5em;"><fieldset hidden><legend>プレビュー</legend><div id="f-preview-content"></div></fieldset><style>.mw-ui-checkbox:has(#f-reply-cb:checked)+input{display:block;}#f-reply{display:none;}</style></div>',postsummary: 'post',replysummary: 'reply to',toppage_css: "<style>.f-sticky>td:first-child>a::before{content:'';background-image:url(https://upload.wikimedia.org/wikipedia/commons/a/a5/OOjs_UI_icon_pushPin.svg);width:.8em;height:.8em;margin-right:.2em;display:inline-block;background-size:.8em}#f-loadmore{display:block;margin-left:auto;margin-right:auto;}</style>",load_more: '<input type="button" value="もっと読み込む" class="mw-ui-button" id="f-loadmore">',create: '<input type="button" class="mw-ui-button mw-ui-progressive" value="スレッドを作成">',createform: '<div id="f-form"><label>スレッド名: <input type="text" id="f-threadname" class="mw-ui-input" style="margin-bottom:.5em;"></label><textarea accesskey="," id="wpTextbox1" cols="80" rows="25" class="mw-editfont-monospace"></textarea><input type="button" value="スレッドを作成" id="f-create" class="mw-ui-button mw-ui-progressive" style="margin-top:.5em;"><input type="button" id="f-preview" value="プレビュー" class="mw-ui-button" style="margin: .5em 0 0 .5em;"><fieldset hidden><legend>プレビュー</legend><div id="f-preview-content"></div></fieldset></div>',createthreadsummary: 'スレッドの作成',posterror: 'エラー: 投稿できませんでした'
}
スクリプトで使用するメッセージの一覧。

追加予定の機能

[edit]
  • 投稿の編集フォームの追加
  • 他人の投稿を編集できないようにする(不正利用フィルター)
  • 未読投稿への自動リダイレクト
  • 複数人への返信

ボード機能の追加

[edit]

この節では、Forum.jsに標準実装されていない「ボード機能」の実装方法について解説しています。

ボード機能とは

[edit]

一般的な掲示板は、次のような仕組みになっています。

├── ボード(板) 1
│     ├── スレッド(話題) 1
│     │     ├── レス(投稿) #1
│     │     └── レス #2
│     └── スレッド 2
│            ├── レス #1
│            └── レス #2
└── ボード 2
       ├── スレッド 1
       │     ├── レス #1
       │     └── レス #2
       └── スレッド 2
              ├── レス #1
              └── レス #2

この中のボード1ボード2ボードです。

手順

[edit]

実装方法はいたって簡単で、以下のコードを自分のウィキに合わせ調整するだけです。

MediaWiki:Common.js
switch(true){
	case mw.config.get('wgPageName').startsWith('Project:掲示板/ボード1'):  //「Project:掲示板/ボード1」の部分は適宜書き換え
		mw.forum = {
			toppage: 'Project:掲示板/ボード1',                              // 同上
			sticky: [],
			threads: '20',
			msg: {}
		};
		break;

	/* ここに追記 */

	default: mw.forum={toppage:''};
}
mw.loader.load('//www.mediawiki.org/w/index.php?title=User:Funa-enpitu/Forum/Forum.js&action=raw&ctype=text/javascript');

ボードを増やしたい場合、/* ここに追記 */の部分に以下の定型文を書き換えて追加していきます。

	case mw.config.get('wgPageName').startsWith('(ボードのページ名)'):
		mw.forum = {
			toppage: '(ボードのページ名)',
			sticky: [],
			threads: '20',
			msg: {}
		};
		break;

後は各ボードに空白のトップページを作成すれば、完成です。

リリースノート

[edit]
  • 1.1 2024/01/25 : 掲示板以外で投稿ボックスが表示されるバグの修正
  • 1.2 2024/01/25 : 設定の規定値を設定
  • 1.3 2024/01/26 : 要約内のポストリンク修正
  • 1.4 2024/02/04 : システムメッセージの修正
  • 1.5 2024/05/12 : IPユーザーに対応

問題と解決策

[edit]
返信されても通知が届かない
$wgEchoMaxMentionsInEditSummaryが1以上に設定されているか確認してください。0の場合、編集の要約内で言及することができず、通知が届きません。
スレッドの一覧画面に「スクリプトに割り当てた時間が終了しました。」と表示される
ポスト数の多いスレッドが複数存在している可能性があります。使っていないスレッドをほかのページに移動させる、ボード機能を使用するなどしてください。それでも改善されない場合、スレッドの分割などを試してみてください。それでも動かない場合、サーバー側の問題である可能性があります。管理者にお問い合わせください。