このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

EasyBBSで1ページの制限を回避する方法について

発言者:SBK
( Date Saturday, October 05, 1996 21:46:42 )


 最近忙しくて見ていない間に、EasyBBSがバリバリにチューンされている
ようで、まだDX前の自分で改良版をつかっている私は、うらしまさんの
気分になっております。

 さて、EasyBBSにコメントを追加していくと、24Kの制限にかかってしまい、
コメントが追加できない旨 言ってきますが、これを回避する方法として、
自動的に次のページを作り、最後にそこへ飛ぶリンクを張るHTMLをくっつける
という方法を思いついたのですが、それはEasyBBSで簡単にできるもの
なのでしょうか? 抜本的に手をいれないと出来ないのでしょうか?

 最近EasyBBSのソースも見てないものですから、とりあえず、できそうだ
とか、それは無理ではないかといったことだけでもよいので、田中さんで
なくてもソースを普段から見ていらっしゃる方で、案がありましたら教えて
いださい。よろしくお願いいたします。

田中求之 さんからのコメント
( Saturday, October 05, 1996 22:53:38 )

>自動的に次のページを作り、最後にそこへ飛ぶリンクを張るHTMLをくっつける
>という方法を思いついたのですが、それはEasyBBSで簡単にできるもの
>なのでしょうか? 抜本的に手をいれないと出来ないのでしょうか?

あ、これはナイスなアイデアですね。

もちろん、スクリプトを書き加えれば可能です(スクリプトに不可能はないのだ (^_^;; )
この週末にテストしてみて、うまくいくようであれば週明けにポストします。

DX の次は、やっぱ Pentium でしょうかね(笑) あ、そのまえに DX4 だっけ?
Overdirve なんていうのもあったな。

田中求之 さんからのコメント
( Monday, October 07, 1996 18:46:58 )

自動的に新しいページを作るスクリプトは、ほぼ完成したのですが、その前に
重大なバグ(ファイルのサイズを正しく認識しない)があることに気が付きました。

そちらの対処を行ってから、スクリプトを紹介します。

ページの表示部分と、コメントの追加部分を書き換えることになります。

SBK さんからのコメント
( Tuesday, October 08, 1996 08:15:41 )

お手数をおかけします。

田中求之 さんからのコメント
( Tuesday, October 08, 1996 18:12:43 )

ページのデータが容量を超えた場合に、自動的に新しいページを作るスクリプトです。
EasyBBS DX を改良して実現しました。

なお、このスクリプトを動かすには、Tanaka's osax 1.0 が必要です(1.0b10 では
なく)。1.0 は、この後、この会議室で公開します(ドキュメントができあがっていない
ので、正式な公開にはもうすこし時間がかかります)。

スクリプトの書き換えを行うのは

1:ページ表示の部分
2:コメント追加処理を行う部分

の2カ所です。

表示しようとするページが、22Kを越えていた場合には、ページのデータの最後に
<end> というタグ(表示はされない)が入っているかどうかをチェックし、これが
入っていた場合には、すでに新しいページへのリンクが済んだものとします。

<end> が無かった場合には、コメント欄を表示します。このコメントは、新しい
ページへと書き込まれることになります。通常のコメントとは異なることを示す
ために、HIDDEN のフィールドを一つ埋め込んだものになっています。

コメントが書き込まれた場合、デコード後にフィールドの数を数えて、4より
大きな場合は、新たなページ作成にともなうコメント追加処理とみなします。

ページをあらたに作ってコメントを書き込んだ後、元のページの最後の部分に
リンクを埋め込み、さらにリンク済みであることを示す <end> を書き込んで
おきます。

新しいページの冒頭には、元のページへのリンクを張ります。

ページの名前は、元のページの名前に # を追加したものにしてあります。
通し番号にすることも可能ですが、処理が煩雑になるため、単純に # を
追加していくようにしました。

以上が、改造の内容です。

田中求之 さんからのコメント
( Tuesday, October 08, 1996 18:14:33 )

まずページ表示部分のスクリプトです

on show_page(BBS_param)
  global msgFldr, myRoom, RO_Flg
  
  set tgPage to BBS_param
  set AppleScript's text item delimiters to {"#"}
  set tgPage to text item 1 of tgPage
  set AppleScript's text item delimiters to {""}
  
  if ".html" is not in tgPage then
    --- backword compatible
    set tgPage to tgPage & ".html"
  end if
  
  set myF to msgFldr & tgPage
  set myData to readFromFile file myF
  
  set roomName to pickUpRoomName(myRoom)
  
  if RO_Flg then
    return http_10_header & myData & return ツ
      & "<p><ul><h4>" & return ツ
      & "<LI><a href=\"bbs.acgi?r=" & myRoom & "\">「" & roomName & "」のトップページへ戻る</a><p>" & return ツ
      & "<li><a href=\"bbs.acgi\">BBS のトップページへ戻る</a></ul></h4><HR><P>"
    
  else if (byteLength of myData) > 22528 then
    
    if (characters -5 thru -1 of myData) as string = "<end>" then
      
      return http_10_header & myData & return ツ
        & "<p><hr><p><ul><h4>" & return ツ
        & "<LI><a href=\"bbs.acgi?r=" & myRoom & "\">「" & roomName & "」のトップページへ戻る</a><p>" & return ツ
        & "<li><a href=\"bbs.acgi\">BBS のトップページへ戻る</a></ul></h4><HR><P>"
    else
      
      
      return http_10_header & myData & return ツ
        & "<FORM METHOD=\"POST\" ACTION=\"bbs.acgi?rc=" & myRoom & "&ADD_" & tgPage & "\">" & return ツ
        & "<h4>コメント</h4><P>" & return ツ
        & "発言者:<INPUT type=text name=name size=40><p>" & return ツ
        & "<TEXTAREA name=comt rows=8 cols=70></TEXTAREA><P>" & return ツ
        & "参考ページ名:<INPUT TYPE=\"TEXT\" name=\"Ref\" size=40><BR>" & return ツ
        & "参考ページURL:<INPUT TYPE=\"TEXT\" name=\"URL\" size=50 value=\"http://\"><P>" & return ツ
        & "<INPUT TYPE=\"HIDDEN\" NAME=\"LAST\" VALUE=\"LAST\">" & return ツ
        & "<INPUT type=submit value=\"Post Comment\"><INPUT type=reset value=\"Reset\">" & return ツ
        & "</FORM><p><hr><p><ul><h4>" & return ツ
        & "<LI><a href=\"bbs.acgi?r=" & myRoom & "\">「" & roomName & "」のトップページへ戻る</a><p>" & return ツ
        & "<li><a href=\"bbs.acgi\">BBS のトップページへ戻る</a></ul></h4><HR><P>"
      
    end if
    
  else
    --- コメント欄を追加して reply する
    return http_10_header & myData & return ツ
      & "<FORM METHOD=\"POST\" ACTION=\"bbs.acgi?rc=" & myRoom & "&ADD_" & tgPage & "\">" & return ツ
      & "<h4>コメント</h4><P>" & return ツ
      & "発言者:<INPUT type=text name=name size=40><p>" & return ツ
      & "<TEXTAREA name=comt rows=8 cols=70></TEXTAREA><P>" & return ツ
      & "参考ページ名:<INPUT TYPE=\"TEXT\" name=\"Ref\" size=40><BR>" & return ツ
      & "参考ページURL:<INPUT TYPE=\"TEXT\" name=\"URL\" size=50 value=\"http://\"><P>" & return ツ
      & "<INPUT type=submit value=\"Post Comment\"><INPUT type=reset value=\"Reset\">" & return ツ
      & "</FORM><p><hr><p><ul><h4>" & return ツ
      & "<LI><a href=\"bbs.acgi?r=" & myRoom & "\">「" & roomName & "」のトップページへ戻る</a><p>" & return ツ
      & "<li><a href=\"bbs.acgi\">BBS のトップページへ戻る</a></ul></h4><HR><P>"
  end if
end show_page

田中求之 さんからのコメント
( Tuesday, October 08, 1996 18:18:49 )

つぎに、コメント追加処理を行う部分のスクリプトです。ここが少し込み入ったもの
になっています。

on Add_comment(BBS_param, post_args)
  global msgFldr, myRoom, RO_Flg
  
  --- コメントを追加するページの確定
  set AppleScript's text item delimiters to {""}
  set tgPage to (characters 5 through -1 of BBS_param) as string
  set AppleScript's text item delimiters to {"#"}
  set tgPage to text item 1 of tgPage
  set AppleScript's text item delimiters to {""}
  
  if RO_Flg then
    return redirect_header & "bbs.acgi?r=" & myRoom & "&" & tgPage & crlf & crlf
  end if
  
  --- post_args のデコード
  set myList to DecodeJArgs post_args
  
  set fldNum to count items in myList
  
  set myName to item 1 of myList
  set myBody to item 2 of myList
  set myRef to item 3 of myList
  set myURL to item 4 of myList
  
  if (myName = "") or (myBody = "") or RO_Flg then
    --- 記入ミス
    --- 元のページへリダイレクト
    return redirect_header & "bbs.acgi?r=" & myRoom & "&" & tgPage & crlf & crlf
  end if
  
  ---  bodyFormat() ハンドラーでメッセージを整える
  set myBody to bodyFormat(myBody)
  
  --- 参考ページ情報の埋め込み
  if myRef ュ "" and myURL ュ "" and myURL ュ "http://" then
    set myBody to myBody & return & return & "<pre>→  <a href=\"" & myURL & "\">" & myRef & "</a></PRE>" & return
  end if
  
  if fldNum > 4 then
    --- 新規ページ作成
    set myFile to alias (msgFldr & tgPage)
    set myTitle to (getPageTitle myFile)
    if last character of myTitle = "#" then
      set myNewTitle to myTitle & "#"
    else
      set myNewTitle to myTitle & " #"
    end if
    
    set roomName to pickUpRoomName(myRoom)
    
    --- ページに書き込むデータを作成する
    set myPage to "<TITLE>" & myNewTitle & "</TITLE>" & return ツ
      & "<BODY BGCOLOR=\"#FFFFFF\">" & return ツ
      & "会議室:「" & roomName & "」<P>" & return ツ
      & "<h2>" & myNewTitle & "</h2>" & return ツ
      & "<h3><a href=\"bbs.acgi?r=" & myRoom & "&" & tgPage & "\">" & myTitle & "</a>からの続き</h3><P><HR><P>" & return ツ
      & "<B>" & myName & "</b> さんからのコメント</a><br>" & return ツ
      & "<TT>(Date: " & ((current date) as string) & ")</TT><P>" & return ツ
      & myBody & "<P><HR><P>" & return
    
    --- メッセージをファイルに記録
    set myF to "BBS_MSG_" & (TimeStamp) & ".html"
    writeToFile myPage to file (msgFldr & myF)
    
    --- Recent 用のデータ書き込み(新たなページを投稿したものとして処理)
    addRecent(myF, myNewTitle, myName, "NEW")
    
    
    --- 元ファイルへのリンクの埋め込み
    
    set lastLink to "<h4><UL>" & return ツ
      & "<LI><a href=\"bbs.acgi?r=" & myRoom & "&" & myF & "\">" & myNewTitle & "に続く</a></UL></h4>" & return ツ
      & "<end>"
    
    
    appendToFile lastLink to myFile
    
    --- メッセージのページへリダイレクト
    return redirect_header & "bbs.acgi?r=" & myRoom & "&" & myF & crlf & crlf
    
  else
    
    --- Jump 用のタグの準備
    set nmTag to (TimeStamp)
    
    --- ページに追加するデータを整える
    set myData to "<a name=\"" & nmTag & "\"><B>" & myName & "</b> さんからのコメント</a><br>" & return ツ
      & "<tt>( Date: " & ((current date) as string) & ")</TT><p>" & return ツ
      & myBody & "<P><HR><P>" & return
    
    --- ファイルへの追加
    set myFile to alias (msgFldr & tgPage)
    appendToFile myData to myFile
    
    --- Recent への記録
    set myTitle to getPageTitle myFile
    addRecent(tgPage, myTitle, myName, nmTag)
    
    --- コメント済みのページへのリダイレクト
    return redirect_header & "bbs.acgi?r=" & myRoom & "&" & tgPage & "#" & nmTag & crlf & crlf
    
  end if
end Add_comment

前薗 健一 さんからのコメント
( Tuesday, October 08, 1996 23:47:46 )

変更部分は DX & STAR ハイブリッド版に反映させたほうがいいですよね?

田中求之 さんからのコメント
( Wednesday, October 09, 1996 00:22:50 )

そうですね、反映してもらった方がよいでしょう。

ただ、リンクの埋め込み方や、新たなページの名前などは、適当に変えてもらった
方がよいかもしれません。Cで処理してしまうなら、通し番号を付けていくといった
ことも、それほどの速度低下の原因にはならないと思いますしね。

上のスクリプトは、あくまで基本的な動作を実現したものですので、もう少し
試してみてから、DX や STAR には組み込むつもりです。

前薗 健一 さんからのコメント
( Wednesday, October 09, 1996 03:00:34 )

らじゃ