ページの作成や編集にはユーザ登録が必要です。
wikiファイルの一括コンバートツール(プラグイン有効)
- 投稿者: MRB
- カテゴリ: その他
- 優先度: 普通
- 状態: 提案
- 日時: 2009年03月01日 15時13分57秒
内容
現在、FSwikiのwikiファイルをhtmlへコンバートするツールが提供されていますが、プラグインは有効になりません。
そのため、「pagelist.cache」ファイルからURLを生成し、httpでアクセスしてHTMLを丸ごと取得、それを保管しているのですが、なかなか手間がかかります。
初回の「wiki全体取得」は人の手で実施するとしても、以降、更新するたびにHTML化を手動でするには限界があるので、そこを自動化できればと考えています。
そこで、サマリの通り、プラグインも有効になるコンバートツール(単独ツール or プラグイン)があればなぁ、と思っています。
あるいは、こうやってやればできる(かも)というような、方式だけでも教えていただければありがたいです。
よろしくお願いします。
コメント
- 上記機能を「FSWiki のプラグインで実現したい」ということでしたら、BBS-サポート掲示板/863 (否定的な結論ですが)が参考になるかもしれません。- 名無しさん (2009年03月01日 17時43分45秒)
- ありがとうございますBBS-サポート掲示板/863 確認しました。もっと機能を絞り、仕様をかちっと決めればできそう…かな(以下はざっくりですが)。
- (基本)更新時に更新されたファイルをhtml化する(save_afterのhook?)。
- html化するとき、プラグインで出力されるものについては、取得時点でのスナップショットとする。
- 初回1回だけは別ツールorローカルサーバで実行する。 - MRB (2009年03月01日 23時52分58秒)
- MRB さんがコメントに書かれた仕様であれば、次のような感じで実現できないでしょうか(構想のみで検証未ですが)。 - 菜梨 (2009年03月07日 08時55分54秒)
- 前提:
- html 化ファイル:pc 用は、./pc/(ページ名).html, 携帯用は、./m/(ページ名).html に保存するものとする(一例)。
- 閲覧権限:非ログインユーザでも閲覧できるページのみ html 化する。
- サイト内リンク:サイト内リンクの URL は、上記 html 化ファイルを指すように自動的に書き換える機能を実装(BugTrack-plugin/388を改造して流用)。
- アクション:ページ編集をはじめとする、ページ閲覧以外のアクションについては、通常の FSWiki と同様、wiki.cgi?action=xxxx にアクセス。
- html 化:
- 非ログインユーザでも閲覧できるページが wiki.cgi 経由で閲覧(wiki.cgi?page=(ページ名))されたら、そのときに標準出力に出力される内容をそのまま ./pc/(ページ名).html、あるいは ./m/(ページ名).html に保存するように wiki.cgi の出力部を改造。
- ページを編集・保存した場合には、その直後に必ずそのページを閲覧するので、自動的に html 化ファイルが作成される。
- 「初回1回だけは別ツールで html 化を実行」については、wiki 内の全ページについて各ページ 1 回ずつ wiki.cgi 経由で閲覧するだけでよい。
- 前提:
- さらに mod_rewrite が使えるのであれば、「要求されたファイルが無い場合には URL を rewrite する」という RewriteCond が書けるようなので、「要求された html ファイルが無い場合には、wiki.cgi 経由で閲覧するように URL を rewrite する」と設定しておけば、初めてのページ閲覧リクエスト時に各ページが html 化されるので「初回1回だけは別ツールで html 化を実行」も不要。 - 菜梨 (2009年03月07日 08時55分54秒)
- 以上です。あとはやっぱり、「プラグインで出力されるものについては、取得時点でのスナップショットとする。」という仕様が受け入れられるかどうかでしょうね。recentdays プラグイン等はもちろん、現実的には include プラグイン等も事実上使えなくなるということになりますよね。 - 菜梨 (2009年03月07日 08時55分54秒)
- コメントありがとうございます。やはり、諦める部分はバッサリ諦めて、となるかと思います。簡易wikiにするならFSWikiLiteも視野に入ってきますが…。
- 目指すところは簡単に扱えてしかも動作が軽いCMSというところでしょうか。
- 動的な部分についてはBBS-サポート掲示板/863 のAjaxも視野に入りますが、EUCとAjax(UTF-8)というのは相性が悪く、いろいろ試しましたが諦めました…。SSIを使う、という前提にするほうが良い気がします。SSIとなると基本的にファイルを作っておく前提になるので、プラグイン改造は必須ですが…。
- 動作サンプル作ってみました - MRB (2009年03月10日 01時01分03秒)
- 単純なつくりで、編集したタイミングでその編集したページにHTTPでアクセスして中身を丸ごと取得し、HTML化しているだけです。 - MRB (2009年03月10日 01時32分06秒)
- やはりHTTPだと遅いので、wiki.cgiのソースをそのまま流用してwikiページをパースして取得する方法を試しています(テスト中)。ただ、そうすると、ログイン状態の場合はログイン状態のwikiページを取得してしまう(非ログインユーザに隠しているものも見えてしまう)という問題が…。$self->{'login_info'} = undef; や $session->param("wiki_id",undef);(wiki_type、wiki_pathも)だけではダメなのでしょうか…。- MRB (2009年04月02日 05時08分08秒)
- get_page_levelでは? - 名無しさん (2009年04月02日 06時42分36秒)
- ページの参照権限だけではページ内で使用されるプラグインで行われるユーザー権限チェックなどが対応できなくなります。解決方法としては、get_page_level と get_login_info を実行時に置き換えて処理するという方法もあります。 - KG (2009年04月02日 09時45分42秒)
- BugTrack-plugin/233あたりですね >プラグインで行われるユーザー権限チェック。一応ソースも添付しました(wikigetter.pm。ほぼwiki.cgiですが)。「et_page_level と get_login_info を実行時に置き換えて処理する」を詳しく教えていただけると助かります。 - MRB (2009年04月03日 01時48分05秒)
- こちらでご紹介頂いているwikigetter.pmを試してみたのですが、htmlディレクトリにファイルとして生成されないようです。どこが間違っているかご教授願えませんでしょうか。
- pluginディレクトリにwikigetterディレクトリを作成しその中にWikigetter.pmを保存(1文字目を大文字に変更)
- Install.pmファイルを下記の形で作成し、wikigetterディレクトリに保存
- 管理画面のプラグインからwikigetterを有効にし、ページを保存後に再度ページを表示してみたのですが、htmlディレクトリに保存されないようです。(wikigetter.pmの前提条件で「_add_staticurlプラグインの使用」とありますので、そのプラグインも有効にして試しましたがファイルが生成されませんでした。) - た (2015年01月13日 16時10分54秒)
############################################################################### # # Wikigetterでhtml保存 # ############################################################################### package plugin::wikigetter::Install; use strict; sub install { my $wiki = shift; $wiki->add_hook("save_after", "plugin::wikigetter::Wikigetter"); } 1;
- wikigetter.pm が残っているか見てみましたが、ものが見当たらないので何とも。。。ただし、書いてある通り中身はほぼwiki.cgiと同じなので、保存ディレクトリに書き込み権限があれば保存されるはずです - MRB (2015年01月13日 19時43分21秒)
- 自分の環境ではうまく機能しなかったので、とりあえずwikigetter.pmを参考に、wiki.cgi内部の処理に修正を加えて保存させるようにしました。 - た (2015年01月13日 22時05分30秒)
- よく見ると私がコメントした後、放置していましたね(汗)。まったく気づいていませんでした。orz ということで、コンバートツールです。ほぼ wiki.cgi なのでDIFFだけ貼っておきます。 - KG (2015年01月15日 10時17分29秒)
--- wiki.cgi Wed Jan 14 19:12:06 2015 +++ wiki2html.pl Thu Jan 15 10:14:13 2015 @@ -120,6 +120,15 @@ foreach(sort(@plugins)){ $plugin_error .= $wiki->install_plugin($_); } +#============================================================================== +# ページ一覧取得 +#============================================================================== +my @_pagelist = $wiki->get_page_list(); +foreach my $_page (@_pagelist){ + if(!$wiki->can_show($_page)){ next; } + $cgi->param("page", $_page); + +#============================================================================== # プラグインごとの初期化処理を起動 $wiki->do_hook("initialize"); @@ -295,6 +304,10 @@ #------------------------------------------------------------------------------ # 出力処理 #------------------------------------------------------------------------------ +#============================================================================== +# 標準出力をブロック +if (0) { +#============================================================================== # ヘッダの出力 if($is_handyphone){ print "Content-Type: text/html;charset=Shift_JIS\n"; @@ -306,6 +319,24 @@ # HTMLの出力 print $output; +#============================================================================== +} +#============================================================================== +# ページ毎の出力処理 + # TODO : リンク先の置換処理など・・・ + + # ファイル出力 + my $htmlfile = "./html/".&Util::url_encode($_page).".html"; + open (DATA, ">$htmlfile") or die $!; + print DATA $output; + close(DATA); + #-------------------------------------------------------------------------- + print "Page(".$_page.") has been saved in a file \"".$htmlfile."\"\n"; + +#============================================================================== +} # foreach : @_pagelist +#============================================================================== + }; my $msg = $@;
- 即席で作成したので、細かい処理などは入れていません。効率化も行っていませんが、とりあえずHTMLに落としたいという方には良いかと。テーマやスタイルシートなどのパスは変更されませんので必要に応じてコピー等行ってください。 - KG (2015年01月15日 10時20分40秒)
最終更新時間:2015年01月15日 10時20分40秒