Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2004-05-10 14:07:49

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

現在、本文とは別に「続き」の部分に書き込まないと文が省略されません。
これを本文に書き込みした際に、文字数制限などである一定の文字数以降は
「続き」に書いた場合と同様な省略を自動でしてくれるプラグインはないでしょうか?

とあるサイトにて1ページ中に9この別記事を同時に表示しているのですが
文字数制限がされていない場合、長くなりすぎるとデザインが崩れてしまって
困っています。

#2 2004-05-10 15:16:45

Taka
メンバー
From: 千葉
登録日: 2003-11-17
投稿: 264
ウェブサイト

Re: アイテムの自動省略について

そういうプラグインはあるかどうかわかりません big_smile

が、プラグインを使わないでもしやるとするならば。
具体的にどういう状況なのかわからないので、ちょっとイメージとは違うかもしれませんが、
テンプレートで、<%body%>の変わりに<%syndicate_description%>を書いたものを1つ用意しておきます(あとは普段のテンプレートと同じにしておく)。
で、スキンの方で、例えば
<%blog(作ったテンプレート名(250))%>
とすれば、そのスキンでは250文字だけ本文が表示されます。ただし、ホントはこれ(<%syndicate_description%>のこと)、RSS用なので、HTMLタグは取り除かれちゃいます。改行も。

あーそうだ、これをやるならテンプレートの<%morelink%>も、

<div class="morelink"><a href="<%itemlink%>">[Read More!]</a></div>

などに置き換えて、必ず続きへのリンクが出るようにしといてください。

オフライン

#3 2004-05-10 15:20:57

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

http://forum.nucleuscms.org/viewtopic.php?p=15083#15083
試していないんですが、これとかどうでしょう?
ぱっとみ、自動で設定した文字数以上以降の文章を「続き」部分に移すプラグインのようです。
まだ改良中なのに加え、このままだと日本語の扱いおかしくなるかもしれませんが sad

#割り込んじゃった、ごめんなさい :cry:

オフライン

#4 2004-05-10 16:16:03

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

Takaさん、Felさん、ありがとうです。

Takaさんのほうを試したところ、アイテムの表示が消えてしまいました。
RSS出力じゃないと駄目なのでしょうか?

Felさんのほうも試しました。
結果です・・・書いたものが全て「...」に置換されてしまいます。
リードモアは表示されましたが^^;
設定文字数(半角)を超えたものは自動的に続きの方へ移動されてました。
ただ、編集から本文に書き込んだものに対しては反応なしでした。

これは、日本語版Nucleusに対応してないということなのでしょうか?

#5 2004-05-10 17:27:24

Taka
メンバー
From: 千葉
登録日: 2003-11-17
投稿: 264
ウェブサイト

Re: アイテムの自動省略について

アイテムの表示というのは、アイテムページのことですか?
だとしたら、上で作成したテンプレートは、省略表示させたいスキンパーツ(例えば「メインの目次ページ」)でのみ、使ってください。

でも消えてしまうということは、そういうことじゃないみたいですね。
うーん、こちらでは普通に250文字で省略表示できましたけど・・・。

オフライン

#6 2004-05-11 09:52:42

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

テンプレート部分
<h3 class="item"><%title%></h3>

<div class="itembody">
  <%syndicate_description%>
  <div class="morelink"><a href="<%itemlink%>">[Read More!]</a></div>
</div>

<div class="iteminfo">
  <%time%> -
  <a href="<%authorlink%>"><%author%></a> -
  <%edit%>
  <%comments%>
</div>

スキン部分
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
  <title><%blogsetting(name)%></title>

  <!-- some meta information (search engines might read this) -->
  <meta name="generator" content="<%version%>" />
  <meta name="description" content="<%blogsetting(desc)%>" />

  <!-- stylesheet definition (points to the place where colors -->
  <!-- and layout is defined -->
  <link rel="stylesheet" type="text/css" href="<%skinfile(default.css)%>" />

  <!-- prevent caching (can be removed) -->
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
  <meta http-equiv="Expires" content="-1" />
 
  <!-- extra navigational links -->
  <link rel="bookmark" title="Nucleus" href="http://nucleuscms.org/" />
  <link rel="archives" title="Archives" href="<%archivelink%>" />
  <link rel="top" title="Today" href="<%todaylink%>" />

  <!-- link RSS as alternate version -->
  <link rel="alternate" type="application/xml+rss" title="RSS" href="xml-rss2.php" />

  <!-- RSD support -->
  <link rel="EditURI" type="application/rsd+xml" title="RSD" href="rsd.php" />

</head>
<body>

<!-- here starts the code that will be displayed in your browser -->
<div class="contents">
<!-- page title -->
<h1><%blogsetting(name)%></h1>

<!-- this is a normally hidden link, included for accessibility reasons -->
<a href="#navigation" class="skip">Jump to navigation</a>

<!-- this tag inserts a weblog using the template named 'default' and  -->
<!-- showing 15 entries                                                -->
<%blog(test(30))%>
<!-- テンプ名はtestにしてあります。 -->

</div><!-- end of the contents div -->

<!-- definition of the logo (left-top) -->
<div class="logo">
<img src="<%skinfile(atom.gif)%>" width="150" height="150" alt="" />
</div>

<!-- definition of the menu -->
<div class="menu">
<!-- accessibility anchor -->
<a name="navigation" id="navigation" class="skip"></a>
<h1 class="skip">Navigation</h1>

<h2>Navigation</h2>
<ul class="nobullets">
  <li><a href="<%todaylink%>">Today</a></li>
  <li><a href="<%archivelink%>">Archives</a></li>
  <li><a href="<%adminurl%>">Admin Area</a></li>
</ul>

<h2>Categories</h2>
<%categorylist(default)%>

<h2>Search</h2>
<%searchform%>

<h2>Login</h2>
<%loginform%>

<h2>My Links</h2>

<ul class="nobullets">
  <li><a href="http://nucleuscms.org/" title="This site is Nucleus-powered">Nucleus</a></li>
  <li><a href="http://www.weblogs.com/" title="latest updates">Weblogs.com</a></li>
  <li><a href="http://www.daypop.com/" title="Search news & weblog sites">DayPop</a></li>
  <li><a href="http://www.google.com/" title="Search the web">Google</a></li>
</ul>

<h2>powered by</h2>
<%nucleusbutton(nucleus2.gif,46,43)%>

</div>

</body>
</html>

これでアイテムを書き込むと書き込みがまったく表示されません。
<%blog(test(30),5)%>にしても変わらず。

#7 2004-05-11 11:59:19

nakahara21
メンバー
From: 尼崎
登録日: 2003-11-14
投稿: 1,298
ウェブサイト

Re: アイテムの自動省略について

<%blog(test(30))%>

ではなく、

<%blog(test,30)%>

とスキンを修正してもダメですかね?


nakahara21
http://nakahara21.com/
(ただいま調整中です)

オフライン

#8 2004-05-11 12:26:21

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

流れからははずれますが、タカさんのおっしゃる処理を自動で行う簡単なプラグインを作ってみました。
スキンタイプの呼び出し方がわからなかったので、適当きわまりないです。
#yuさんのマニュアル訳みながらてきとーに組みました。恥ずかし :oops:

プラグインオプションでトップに表示する文字数と記事へのリンクテキストを設定できます。
デフォルトは文字数100、リンクテキストは「...」です。
また、2.5beta以降ならblogごとの「設定」から適用するか否かの設定が選べます。
デフォルトはnoなので、2.5beta以降(2.5beta、2.5CVS、3.0RC)をお使いなら
blogの「設定」からOptions for NP_ShortenItemオプションを設定してください。
なお、プラグインの順番はWikiStyleやFootnoteなどの変換よりあとにしてください。
#あまりにもへぼへぼだったので休みに修正しました。すいません :oops:
#PreItemからスキンタイプそのまま引けるのかな?

<?
class NP_ShortenItem extends NucleusPlugin {

   function getName() { return 'ShortenItem'; }
   function getAuthor()  { return 'Fel'; }
   function getURL() { return ''; }
   function getVersion() { return '0.1'; }
   function getDescription() {
      return 'This plugin shortens the item body in index page , if it is longer than a certain size';
   }

   function supportsFeature($what) {
      switch($what) {
        case 'SqlTablePrefix':
          return 1;
        default:
          return 0;
      }
   }

   function getEventList() {
      return array('PreSkinParse','PreItem');
   }

   function install() { 
      if(getNucleusVersion() > 220) {
      $this->createBlogOption('use_shorten_item','Use shorten item in index page?','yesno','no');
      }
      $this->createOption('split_words_count','Number of words keep in the index body','text','100');
      $this->createOption('text_more_link','Text of more link','text','...');
   } 

   function event_PreSkinParse(&$data) {
     global $currentSkinType;
     $currentSkinType = $data['type'];
   }

   function event_PreItem(&$data) {
     global $blog; 
     $currentBlogid = $blog->getID();

     if(getNucleusVersion() > 220){
       if($this->getBlogOption($currentBlogid,'use_shorten_item')=='yes'){
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid);
       }
      } else {
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid);
      }
    }

   function doShortenIndexBody(&$indexbody,&$indexitemid) {
     global $currentSkinType;
     switch($currentSkinType) {
     case 'index':
     $indexbody = shorten(strip_tags($indexbody), $this->getOption('split_words_count'), "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>");
     break;
     }
   }
}
?>

オフライン

#9 2004-05-11 12:34:46

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

<%blog(test,30)%>
だとtestテンプレートで30アイテムになっちゃいませんか?
<%body%>部分に1アイテム分の表示をするには
<%blog(test,1)%>でよいのですが、これに文字数制限を
掛けなくてはいけないので、どうしたらよいのかな~と
一番答えに近そうなFelさんのURL先のプラグインのコードと
にらめっこしてたり^^;

問題のコード
<?
/*
   History:
     v0.1, May 5, 2004 - Initial version
     v0.2, May 6, 2004 - Fixed URL spliting
     v0.3, May 6, 2004 - Re-implemented event_PreAddItem to deal with HTML properly
*/
class NP_AutoExtended extends NucleusPlugin {

   function getName() { return 'AutoExtended'; }
   function getAuthor()  { return 'Edmond Hui (admun)'; }
   function getURL() { return ''; }
   function getVersion() { return 'v0.3'; }
   function getDescription() {
      return 'This plugin splits the item body into extended text if it is longer than a certain size';
   }

   function supportsFeature($what) {
      switch($what) {
        case 'SqlTablePrefix':
          return 1;
        default:
          return 0;
      }
   }

   function getEventList() {
      return array('PreAddItem');
   }

   function install() {
      $this->createOption('split_count','Number of words keep in the body','text','20');
   }

   function event_PreAddItem($data) {
     $state = "close";
     $wordcount = 0;
     $tempbody = '';
     $tempext ='';
     for ($i=0; $i < strlen($data['body']); $i++) {
       switch ($data['body'][$i]) {
         case '<':
           $state = "open";
           break;
         case '>':
           if ($state == "close") break;
           $state = "close";
           break;
         case ' ':
           if ($state == "close") $wordcount++;
           break;
         case '\n':
         default:
           break;
       }

       if ($wordcount < $this->getOption('split_word_count'))
         $tempbody = $tempbody . $data['body'][$i];
       else
         $tempext = $tempext . $data['body'][$i];
     }

     if ($wordcount < $this->getOption('split_word_count')) return;

     $data['body'] = $tempbody . "... ";
     $data['more'] = "..." . $tempext . "\n" . $data['more'];
   }

}

?>

赤く表示した部分に問題?があるのかな・・・・・
投稿すると本文に書き込んだ文章が全て続きの法へ移動されて
本文の方に「... 」が置き換えられます。
さらに、移動された文章の前にも「... 」が追加されてたり。
このコードで作者がやりたいことは・・・・
指定文字数のところで「... 」を追加して
指定文字数以降を続きの方へ移し、文章の前に「... 」を追加する
予定だったのかなと。
文字数制限が10として
1234567890123456789と本文に書き込んだ場合
アイテム表示は、
1234567890...
続きを読む

で、続きの部分の表示は
1234567890...
...123456789

と・・・・・。でも、実際使ってみると
アイテム表示は、
...
続きを読む

で、続きの部分の表示は
...
...1234567890123456789

となってます。
文字数制限を適用できてないところがなんとも・・・・
さらに言ってしまうと、一度投稿したアイテムには適用されず
本文がそのまま全て表示されてしまいました。

というのが今の現状です。

#10 2004-05-11 12:44:59

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

Felさんが作ってくれたプラグインを早速ためしてみました。
100というのは文字数ですよね^^;全角カタカナ28文字しか表示されなかった。
でも、素晴らしいです。 ちゃんと動きました。表示されました big_smile

#11 2004-05-11 12:55:11

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

報告

文字数制限を45にしたら半角数字(1バイト文字)で1文字表示であとは...に。
44以下の場合は...のみ表示。48で4文字表示で49以上だと全部表示でした。

全角文字(2バイト文字)でのテスト結果。46で1文字表示。45で...のみ。
46以上は+2につき1文字の表示でした。

#12 2004-05-11 15:57:56

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

にゃんこ さんの発言:

報告

文字数制限を45にしたら半角数字(1バイト文字)で1文字表示であとは...に。
44以下の場合は...のみ表示。48で4文字表示で49以上だと全部表示でした。

全角文字(2バイト文字)でのテスト結果。46で1文字表示。45で...のみ。
46以上は+2につき1文字の表示でした。

アバウトな代物でごめんなさい・・・。
あまりに恥ずかしかったのでちょっと書き直しました。動作は変わってません。

あと引用したプラグインが動作しなかったのは、オプション名が設定と呼び出しで異なっているからだとおもいます :shock:
>全然観ずに紹介した人

オフライン

#13 2004-05-11 17:03:28

にゃんこ
ゲストユーザー

Re: アイテムの自動省略について

いえいえ、大変素晴らしいと思いますよ、このプラグイン。
はてな?というサイトでもこの条件があるblogを探してる人がいましたし。
このプラグインが存在するのは他にはMTくらいだそうです。
http://www.nonplus.net/software/mt/MTPa ... m#Paginate

しばらく、自分でもどこをどうすればよいのか考えてみます。
へっぽこな私でもなんか改善あったらまた書き込みします~。

#14 2004-05-11 17:13:11

Taka
メンバー
From: 千葉
登録日: 2003-11-17
投稿: 264
ウェブサイト

Re: アイテムの自動省略について

すいません、おおぼけなことを書いていました。

テンプレートの方に、

<%syndicate_description(250)%>

です。(文字数は適当に)

で、スキンの方には普通に

<%blog(test,記事数)%>

で。

うわーんごめんなさい :cry:
まぁFelさん書いてくれたからよかったということで。

オフライン

#15 2004-05-12 14:42:08

にゃんこ
メンバー
From: 地球
登録日: 2004-05-12
投稿: 150

Re: アイテムの自動省略について

Takaさん、ありがとうございます。
ちゃんと省略されましたね。ただ、リードモアが必ず出てしまうのですね。


いまだにFelさんのプラグインを指定文字数で省略されるようにしようと
にらめっこ状態です。Felさんにかなり期待しちゃってるかも smile

オフライン

#16 2004-05-12 17:34:13

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムの自動省略について

えーとですねえ,長さが思ったようにならないというのは,リンク先のURLを文字列とみたてて,その長さを含めて指定文字以内にしようとしているからです。
つまり,例えば指定が100文字で,URLが50字あったら50字でちょん切ります。
さらに,この文字数は全角を2文字と数えるので実質25字になってしまうわけです。
そのあたりを考慮してちょっと書き直してみました(勝手にすみません,Felさん)
ついでに,行数で切るようなモードも作ってみました。これも幅は全角2文字換算になります。
ただ,どちらもタグを全部取ってしまうのがちょっと問題ですよねえ。これを完全にしようとしたら
結構大手術が必要になりそうですが。

<?php
class NP_ShortenItem extends NucleusPlugin { 

   function getName() { return 'ShortenItem'; } 
   function getAuthor()  { return 'Andy'; } 
   function getURL() { return ''; } 
   function getVersion() { return '0.2'; } 
   function getDescription() { 
      return 'This plugin shortens the item body in index page , if it is longer than a certain size'; 
   } 

   function supportsFeature($what) { 
      switch($what) { 
        case 'SqlTablePrefix': 
          return 1; 
        default: 
          return 0; 
      } 
   } 

   function getEventList() { 
      return array('PreSkinParse','PreItem'); 
   } 

   function install() { 
      if(getNucleusVersion() > 220) { 
        $this->createBlogOption('use_shorten_item','アイテムの自動分断機能を使う','yesno','no'); 
        $this->createOption('char_mode', '文字数モードか行数モードか','select','char','文字数|char|行数|line');
        $this->createOption('column_width', '1行の文字数(行数モードで有効,全角は2文字にカウント)','text','60');
        $this->createOption('max_raws', '最大行数(行数モードで有効)','text','20');
      } 
      $this->createOption('split_words_count','インデックスの方に入れる最大文字数(文字数モードで有効)','text','100');
      $this->createOption('text_more_link','リンクに使うテキスト','text','...'); 
   } 

   function event_PreSkinParse(&$data) { 
     global $currentSkinType; 
     $currentSkinType = $data['type']; 
   } 

   function event_PreItem(&$data) { 
     global $blog; 
     $currentBlogid = $blog->getID(); 

     if(getNucleusVersion() > 220){ 
       if($this->getBlogOption($currentBlogid,'use_shorten_item')=='yes'){ 
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid); 
       } 
      } else { 
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid); 
      } 
    } 

   function doShortenIndexBody(&$indexbody,&$indexitemid) {
     global $currentSkinType; 
     switch($currentSkinType) { 
     case 'index': 
       if((getNucleusVersion()>220) && ($this->getOption('char_mode')=='line')) {
          $indexbody = strip_tags($indexbody);
          $width = $this->getOption('column_width');
          $raws = $this->getOption('max_raws');
          $arr = split("\n",$indexbody);
          $indexbody = '';
          $max = sizeof($arr);
          for ($i = 0; $i < $max; ++$i) {
             $w = mb_strwidth($arr[$i],_CHARSET);
             if (($chars = $width*$raws) < $w) {
                $indexbody .= shorten($arr[$i], $chars, '');
                $indexbody .= "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>";
                break;
             } else
                $indexbody .= $arr[$i]."<br />\n";
             $raws -= (int)floor(($w-1) / $width)+1;
          }
       } else {
		  $linkurl = "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>";
		  $linkwidth = mb_strwidth($linkurl);
          $indexbody = shorten(strip_tags($indexbody), $this->getOption('split_words_count')+$linkwidth, $linkurl);
       }
     break; 
     } 
   } 
} 
?>

オフライン

#17 2004-05-12 18:44:27

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

Andy さんの発言:

えーとですねえ,長さが思ったようにならないというのは,リンク先のURLを文字列とみたてて,その長さを含めて指定文字以内にしようとしているからです。
つまり,例えば指定が100文字で,URLが50字あったら50字でちょん切ります。
さらに,この文字数は全角を2文字と数えるので実質25字になってしまうわけです。
そのあたりを考慮してちょっと書き直してみました(勝手にすみません,Felさん)
ついでに,行数で切るようなモードも作ってみました。これも幅は全角2文字換算になります。
ただ,どちらもタグを全部取ってしまうのがちょっと問題ですよねえ。これを完全にしようとしたら
結構大手術が必要になりそうですが。

謝罪なんてとんでもない。てきとープラグインをまともな形にしてくださって感謝です。
タグは・・・全部とった文字数で切り、かつ閉じ忘れがあれば対処するってのはかなり大がかりですよね。
画像をどうするかという問題も残りますし。勉強がてら考えてみつつ、密かに期待してみたり wink

オフライン

#18 2004-05-12 22:24:43

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムの自動省略について

文字数モードの方だけですが,タグを消さないバージョンを作ってみました。
ただし,XMLのパーサを利用しているため,XMLの形式に合わない場合は従来通りの処理になります。
例えば,<img>タグを入れる場合
<img src="http://....." />
のように最後にスラッシュを入れておかないとだめです。
文字数で切るところで,閉じてないタグがある場合,タグの前まで戻って切ります(のはず)。
あまりテストしてないので,ちゃんと動かないかもしれませんが。

<?php
class NP_ShortenItem extends NucleusPlugin { 

   function getName() { return 'ShortenItem'; } 
   function getAuthor()  { return 'Andy'; } 
   function getURL() { return ''; } 
   function getVersion() { return '0.3'; } 
   function getDescription() { 
      return 'This plugin shortens the item body in index page , if it is longer than a certain size'; 
   } 

   function supportsFeature($what) { 
      switch($what) { 
        case 'SqlTablePrefix': 
          return 1; 
        default: 
          return 0; 
      } 
   } 

   function getEventList() { 
      return array('PreSkinParse','PreItem'); 
   } 

   function install() { 
      if(getNucleusVersion() > 220) { 
        $this->createBlogOption('use_shorten_item','アイテムの自動分断機能を使う','yesno','no'); 
        $this->createOption('char_mode', '文字数モードか行数モードか','select','char','文字数|char|行数|line');
        $this->createOption('column_width', '1行の文字数(行数モードで有効,全角は2文字にカウント)','text','60');
        $this->createOption('max_raws', '最大行数(行数モードで有効)','text','20');
      } 
      $this->createOption('split_words_count','インデックスの方に入れる最大文字数(文字数モードで有効)','text','100');
      $this->createOption('text_more_link','アイテム本体へのリンクテキスト(省略時に表示)','text','...'); 
   } 

   function event_PreSkinParse(&$data) { 
     global $currentSkinType; 
     $currentSkinType = $data['type']; 
   } 

   function event_PreItem(&$data) { 
     global $blog; 
     $currentBlogid = $blog->getID(); 

     if(getNucleusVersion() > 220){ 
       if($this->getBlogOption($currentBlogid,'use_shorten_item')=='yes'){ 
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid); 
       } 
      } else { 
        $this->doShortenIndexBody($data['item']->body,$data['item']->itemid); 
      } 
    } 

   function doShortenIndexBody(&$indexbody,&$indexitemid) {
     global $currentSkinType; 
     switch($currentSkinType) { 
     case 'index': 
       if((getNucleusVersion()>220) && ($this->getOption('char_mode')=='line')) {
		  
//		  $p = xml_parser_create();
//		  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, FALSE);
//		  xml_parse_into_struct($p,'<doc>'.$indexbody.'</doc>',$vals,$index);
//		  xml_parser_free($p);
          
          $indexbody = strip_tags($indexbody);
          $width = $this->getOption('column_width');
          $raws = $this->getOption('max_raws');
          $arr = split("\n",$indexbody);
          $indexbody = '';
          $max = sizeof($arr);
          for ($i = 0; $i < $max; ++$i) {
             $w = mb_strwidth($arr[$i],_CHARSET);
             if (($chars = $width*$raws) < $w) {
                $indexbody .= shorten($arr[$i], $chars, '');
                $indexbody .= "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>";
                break;
             } else
                $indexbody .= $arr[$i]."<br />\n";
             $raws -= (int)floor(($w-1) / $width)+1;
          }
       } else {
		  $p = xml_parser_create('UTF-8');
		  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, FALSE);
		  if (_CHARSET != 'UTF-8')
		  	$indexbody = mb_convert_encoding($indexbody, 'UTF-8', _CHARSET);
		  if (xml_parse_into_struct($p,'<doc>'.$indexbody."</doc>",$vals,$index)) {
			  xml_parser_free($p);

			  $maxchars = $this->getOption('split_words_count');
			  $xml_max = sizeof($vals)-1;
			  $stack = array();
			  $link = FALSE;
			  for ($i = 0; $i < $xml_max; ++$i) {
				switch ($vals[$i]['type']) {
				case 'open' : array_push($stack, $i);
							  break;
				case 'close': array_pop($stack);
				}
				if ($data = $vals[$i]['value']) {
					if (($chars = mb_strwidth($data, _CHARSET)) >= $maxchars) {
						if ($vals[$i]['type'] == 'complete')
							--$i;
						else {
							$vals[$i]['value'] = shorten($data, $maxchars, '');
						}
						$link = TRUE;
						break;
					} else {
						$maxchars -= $chars;
					}
				}
			  }
			  if (sizeof($stack) > 1) $i = $stack[1]-1;
			  $indexbody = $vals[0]['value'];
			  for ($j = 1; $j <= $i; ++$j) {
				switch ($vals[$j]['type']) {
				case 'open' :
					$indexbody .= '<'.$vals[$j]['tag'];
					if ($vals[$j]['attributes'])
						foreach ($vals[$j]['attributes'] as $key => $val)
							$indexbody .= ' '.$key.'="'.$val.'"';
					$indexbody .= '>'.$vals[$j]['value'];
					break;
				case 'close':
					$indexbody .= '</'.$vals[$j]['tag'].'>';
					break;
				case 'cdata':
					$indexbody .= $vals[$j]['value'];
					break;
				case 'complete':
					if ($vals[$j]['value']) {
						$indexbody .= '<'.$vals[$j]['tag'];
						if ($vals[$j]['attributes'])
							foreach ($vals[$j]['attributes'] as $key => $val)
								$indexbody .= ' '.$key.'="'.$val.'"';
						$indexbody .= '>'.$vals[$j]['value'].'</'.$vals[$j]['tag'].'>';
					} else {
						$indexbody .= '<'.$vals[$j]['tag'];
						if ($vals[$j]['attributes'])
							foreach ($vals[$j]['attributes'] as $key => $val)
								$indexbody .= ' '.$key.'="'.$val.'"';
						$indexbody .= ' />';
					}
				}
			  }
			  if (_CHARSET != 'UTF-8')
				$indexbody = mb_convert_encoding($indexbody, _CHARSET, 'UTF-8');
			  if ($link)
			  	$indexbody .= "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>";
		  } else {
			  xml_parser_free($p);
			  if (_CHARSET != 'UTF-8')
				$indexbody = mb_convert_encoding($indexbody, _CHARSET, 'UTF-8');
		      $linkurl = "<a href=\"".createItemLink($indexitemid)."\">".$this->getOption('text_more_link')."</a>";
		      $linkwidth = mb_strwidth($linkurl,_CHARSET);
              $indexbody = shorten(strip_tags($indexbody), $this->getOption('split_words_count')+$linkwidth, $linkurl);
          }
       }
     break; 
     } 
   } 
} 
?>

オフライン

#19 2004-05-13 02:15:04

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

これはかなり便利かも・・・
知人に勧めてテストさせます :twisted:

オフライン

#20 2004-05-13 09:03:32

にゃんこ
メンバー
From: 地球
登録日: 2004-05-12
投稿: 150

Re: アイテムの自動省略について

す、すごいです。
どんどん形になっていく・・・。

ところで、3.0RCだとプラグインオプションの日本語が文字化けしてしまうのですが
2.5のほうの改善策を入れてみたところ、改善されなかったので3.0RC用に別のが
あるのでしょうか?

オフライン

#21 2004-05-13 10:19:47

Fel
メンバー
From: Kyoto
登録日: 2003-11-06
投稿: 599
ウェブサイト

Re: アイテムの自動省略について

にゃんこ さんの発言:

ところで、3.0RCだとプラグインオプションの日本語が文字化けしてしまうのですが
2.5のほうの改善策を入れてみたところ、改善されなかったので3.0RC用に別のが
あるのでしょうか?

最新版だとなおっているはずです。
ただプラグイン本体もEUC-JPなりUTF-8なりの本体に合致した文字コードで保存する必要がありますが。

オフライン

#22 2004-05-13 12:22:58

にゃんこ
メンバー
From: 地球
登録日: 2004-05-12
投稿: 150

Re: アイテムの自動省略について

試しにJISからEUCに変換して保存をしてみたところエラーが出ました

が、元からEUC状態のところにコピペしたら直りました。
ありがとうございます。

オフライン

#23 2004-09-24 15:41:13

Andy
メンバー
登録日: 2004-03-18
投稿: 1,495
ウェブサイト

Re: アイテムの自動省略について

バグを修正しました。UTF-8版です。
EUC-JPで使う場合は解凍してできたファイルをエディタでUTF-8として読み込み,EUC-JPに変換してください


Attachments:
zip NP_ShortenItem.zip, Size: 1.95 KiB, Downloads: 746

オフライン

Board footer