概要
Fess 15.9 の検索画面は、常に静的テーマで表示されます。静的テーマは /api/v2/* API を 利用する独立した SPA(シングルページアプリケーション)です。テーマは ZIP ファイルとして 配布し、管理画面からアップロードして有効化します。テーマを選んでいない場合は、Fess に 同梱の静的テーマ bootstrap が使われます。
検索画面の見た目を変えるには、別のテーマをインストールするか(テーマ を参照)、独自のテーマを作ります。独自のテーマは、同梱のテーマを複製して変更するのが 最も簡単です(同梱テーマのカスタマイズ を参照)。
注釈
静的テーマは Fess 15.7 以降で利用でき、15.9 で既定の検索画面になりました。検索画面の JSP を差し替える JAR テーマプラグインは、15.9 で削除されました。 JAR テーマプラグイン(15.9 で削除) を参照してください。
静的テーマ
静的テーマは、theme.yml マニフェストと index.html を含む静的リソースの 集合です。テーマ本体は Fess の /api/v2/* API を呼び出すフロントエンド アプリケーションとして実装します。
構造
静的テーマは、次のようなディレクトリ構成になります。
マニフェスト (theme.yml)
theme.yml は ZIP のルートに配置する必須のマニフェストです。以下は最小構成の 例です。
指定できるフィールドは以下のとおりです。
| フィールド | 必須 | 説明 |
|---|---|---|
apiVersion | 必須 | 固定値 fess.codelibs.org/v1。 |
kind | 必須 | 固定値 StaticTheme。 |
name | 必須 | テーマ名。 |
displayName | 必須 | 管理画面に表示される名前。 |
version | 必須 | セマンティックバージョニング形式(例: |
author | 任意 | 作者名。 |
description | 任意 | テーマの説明。 |
license | 任意 | ライセンス。 |
homepage | 任意 | ホームページ URL。 |
minFessVersion | 任意 | テーマが対応する Fess の最小バージョン。 |
supportedLocales | 任意 | 対応ロケールの一覧(例: [en, ja, de])。 |
entry | 任意 | SPA のエントリー HTML。既定値は index.html。 |
spaFallback | 任意 | 非推奨。互換性のために受け付けますが、読まれません。15.9 からは検索画面の 各パスで常にエントリー HTML が返ります。 |
注釈
ZIP からアップロードする場合、展開先のディレクトリ名は name から自動的に 決まります。themes/ ディレクトリに手動でテーマを配置する場合は、ディレクトリ名を name と一致させてください。一致しないテーマは再スキャン時に無視されます。
注釈
プレビュー用のサムネイルは、テーマのルートに thumbnail.png という固定名で 配置します(管理画面のテーマ一覧で表示されます)。この画像はマニフェストの フィールドではなく、ファイル名で認識されます。サイズは 512KB 以内・512×512 ピクセル以内を推奨します。
配信と API
静的テーマは
/themes/<name>/配下で配信されます(<name>はtheme.ymlのname)。/、/search、/advance、/help、/error、/profile、/cache、/chatの各パスでエントリー HTML(既定はindex.html)が返され、 以降のルーティングは SPA が行います。15.9 からはspaFallbackの値に関係なく こう動作し、このフィールドは読まれません。エラーもテーマが表示します。リクエストが失敗すると、ブラウザには要求された URL のまま、 実際の HTTP ステータスでテーマのエントリー HTML が返ります。
管理画面(
/admin/*)、/api/*、ログイン画面などは静的テーマの対象外で、 Fess 本体が処理します。テーマの SPA は、検索結果やチャットなどのデータを
/api/v2/*API から取得 します。エントリー HTML の
{{themePath}}は、配信時にthemes/<name>に置き換えられます。 テーマのファイルをindex.htmlから参照するときは{{themePath}}/assets/styles.cssのように書きます。テーマ名を直接書かないので、別の名前でインストールしても自分の ファイルを読み込めます。エントリー HTML には、スクリプト・スタイル・画像・通信の取得元を Fess 自身に限る
Content-Security-Policyヘッダーが付きます(インラインのスタイルは許可され、 インラインのスクリプトは許可されません)。そのため外部の CDN のフォントやスクリプトは 読み込まれません。テーマに同梱してください。エントリー HTML の
Content-Security-Policyにはframe-ancestors 'none'が含まれ、X-Frame-Options: DENYヘッダーも付くため、ページは他のページのフレームに表示されません。frame-ancestorsの値はfess_config.propertiesのtheme.index.frame.ancestors(デフォルト:'none')で変更できます。空にするとframe-ancestorsを付けません (X-Frame-Options: DENYは付いたままです)。WebKit 系のブラウザー(Safari など)は、frame-ancestors 'none'のもとではテーマがblob:URL で表示するフレーム (PDF のプレビューやキャッシュの表示)を空にします。これらを表示するには値を空にします。
パッケージング
fess-themes リポジトリの scripts/package.sh を使用すると、テーマを配布用の ZIP にまとめられます。
dist/example-<version>.zip が生成されます(<version> は theme.yml の version)。
注釈
theme.yml は ZIP のルートに配置する必要があります。サブディレクトリに 入れると、アップロード時に認識されません。
公開
Fess プロジェクトが開発しているテーマは https://maven.codelibs.org/release/org/codelibs/fess/themes/ 以下に公開されています。配置は <name>/<version>/<name>-<version>.zip で、隣に .sha1 が、テーマごとに公開済みバージョンを並べた maven-metadata.xml が置かれます。 bin/fess-setup install theme <name> はこのメタデータを読み、動作中の Fess 用に作られたバージョンを選びます。
テーマのバージョンは対象とする Fess の系列に合わせ、アーカイブの中身を変えたときは必ずバージョンを上げてください。公開済みのバージョンが上書きされることはないため、バージョンを据え置いた変更は配布されません。
マニフェストに上限を表すフィールドが無いのも同じ理由です。公開されたアーカイブは変更されないため、新しい Fess で動作しなくなったテーマにあとから上限を追加することはできません。その系列向けに公開しないことで、分かった時点で同じことを表せます。
注釈
公開済みのバージョンを調べるときは、ディレクトリ一覧ではなく maven-metadata.xml を使ってください。ディレクトリ索引は定期的に生成されるため、新しく公開したテーマは一覧に現れるより先にメタデータから読み取れます。
インストールと有効化
管理画面で「システム」→「テーマ」(
/admin/theme/)を開きます。作成した ZIP ファイルをアップロードします。公開済みのテーマは、コマンドラインから
bin/fess-setup install theme <name>でインストールすることもできます。 fess-setup コマンド を参照してください。一覧ページの「デフォルトテーマ」プルダウンから対象テーマを選び、「設定」ボタンを 押して有効化します。
有効化の仕組みは以下のとおりです。
「設定」ボタンを押すと、選択したテーマ名がシステムプロパティ
theme.defaultに保存され、システム全体の既定テーマになります。テーマ名を仮想ホストのキーと一致させると、その仮想ホストにアクセスしたときだけ テーマが適用されます。これにより、仮想ホストごとにテーマを切り替えられます。
ディスク上の
themes/ディレクトリを直接更新した場合は、「再読み込み」で 再スキャンできます。
注釈
ZIP のアップロードには、ファイルサイズ・展開後の合計サイズ・エントリー数などの 上限があり、fess_config.properties の theme.* プロパティで調整できます (例: theme.upload.max.size は既定 50MB、theme.directory.path は既定 themes)。展開時には ZIP Slip や zip bomb を防ぐための検証が行われます。
同梱テーマのカスタマイズ
同梱のテーマ bootstrap は、Fess のインストール先の app/themes/bootstrap/ (RPM/DEB パッケージでは /usr/share/fess/app/themes/bootstrap/)にあります。 直接編集しないでください。アップグレードで置き換わるうえ、bootstrap という名前は 同梱のテーマ専用で、削除もアップロードによる置き換えもできません。別の名前で複製して 使います。
ディレクトリを複製します。例えば
mythemeとします:theme.ymlのnameをmythemeに変え、displayNameも変えます。nameはディレクトリ名と一致させます。index.htmlは変更しません。同梱のindex.htmlは、スタイルシート・ロゴ・ スクリプトなど自分のファイルを{{themePath}}/assets/...で参照しており、Fess は 配信時に{{themePath}}をthemes/<name>(theme.ymlのname)に 置き換えます。そのため、名前を変えるだけで複製したテーマは自分のファイルを読み込みます。index.htmlから参照するファイルを追加するときも、{{themePath}}/assets/...の 形で書いてください。変更を加えます。
配色・レイアウト:
assets/styles.cssロゴ:
assets/logo-head.png(ヘッダー)とassets/logo.png(検索トップ)フッター(
footer.copyright_org)などの文言: 言語ごとのi18n/messages.<locale>.jsonページの構造:
index.html
theme.ymlがルートに来るようにディレクトリを ZIP にまとめ、管理画面の 「システム」>「テーマ」でアップロードします:ディレクトリを
app/themes/に置き、同じページの「再読み込み」を押してもかまいません。同じページで
mythemeを既定のテーマに設定します。
注釈
同梱のテーマは、その Fess のバージョンの /api/v2/* API に合わせてあります。 Fess をアップグレードしたら、新しい同梱テーマから複製し直して変更を再適用してください。
JAR テーマプラグイン(15.9 で削除)
JSP・CSS・画像を fess-theme-* の JAR に入れ、仮想ホストのキーと同じ名前のテーマとして 適用する JAR テーマプラグインの種類は、Fess 15.9 で削除されました。15.9 は JAR テーマを 展開せず、どの画面にも使いません。
管理画面の「システム」→「プラグイン」からインストールしても、種類
jarの汎用 JAR としてapp/WEB-INF/plugin/に置かれるだけで、画面は何も変わりません。以前のバージョンから 残ったfess-theme-*.jarも同じように表示され、この画面またはbin/fess-setup remove plugin <name>で削除できます。bin/fess-setupはfess-theme-*を一覧に表示せず、インストールもしません。
JAR テーマで行っていた変更は、静的テーマに移してください。
検索画面の配色・レイアウト・ロゴは、同梱のテーマを複製して変更します (同梱テーマのカスタマイズ を参照)。
仮想ホストごとに見た目を変えていた場合は、仮想ホスト名と同じ名前の静的テーマを インストールします(仮想ホスト を参照)。
ログイン画面(
/login/)は、すべての仮想ホストで共通の画面です。テーマで変えることは できません。
既存テーマの例
fess-themes - 静的テーマ集 (
codesearch、docsearchなど複数の静的テーマを収録)
参考情報
プラグインアーキテクチャ - プラグインアーキテクチャ
プラグイン - プラグインのインストール