ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE3/plugins/opDiaryPlugin/trunk/lib/helper/opDiaryHelper.php @ 10513

Last change on this file since 10513 was 10513, checked in by ebihara, 13 years ago

added support for truncate titles of the opDiaryPlugin

File size: 3.4 KB
Line 
1<?php
2
3/**
4 * This file is part of the OpenPNE package.
5 * (c) OpenPNE Project (http://www.openpne.jp/)
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file and the NOTICE file that were distributed with this source code.
9 */
10
11function op_diary_within_page_link($marker = '▼')
12{
13  static $n = 0;
14
15  $options = array();
16  if ($n)
17  {
18    $options['name'] = sprintf('a%d', $n);
19  }
20  if ($marker)
21  {
22    $options['href'] = sprintf('#a%d', $n+1);
23  }
24
25  $n++;
26
27  return content_tag('a', $marker, $options);
28}
29
30/**
31 * truncates a string
32 *
33 * @param string $string
34 * @param int    $width
35 * @param string $etc
36 * @param int    $rows
37 * @param bool   $is_html
38 * @return string
39 */
40function op_diary_truncate($string, $width = 80, $etc = '', $rows = 1, $is_html = true)
41{
42  $rows = (int)$rows;
43  if (!($rows > 0))
44  {
45    $rows = 1;
46  }
47
48  // converts special chars
49  $trans = array(
50    "\r\n" => ' ',
51    "\r"   => ' ',
52    "\n"   => ' ',
53  );
54
55  // converts special chars (for HTML)
56  if ($is_html)
57  {
58    $trans += array(
59      // for htmlspecialchars
60      '&amp;'  => '&',
61      '&lt;'   => '<',
62      '&gt;'   => '>',
63      '&quot;' => '"',
64      '&#039;' => "'",
65      // for IE's bug
66      ' '     => ' ',
67    );
68  }
69  $string = strtr($string, $trans);
70
71  $result = array();
72  $p_string = $string;
73  for ($i = 1; $i <= $rows; $i++)
74  {
75    if ($i === $rows)
76    {
77      $p_etc = $etc;
78    }
79    else
80    {
81      $p_etc = '';
82    }
83
84    if ($i > 0)
85    {
86      // strips the string of pre-line
87      if (isset($result[$i - 1]))
88      {
89        $p_string = substr($p_string, strlen($result[$i - 1]));
90      }
91      if (!$p_string)
92      {
93        break;
94      }
95    }
96
97    $result[$i] = smarty_modifier_t_truncate_callback($p_string, $width, $p_etc);
98  }
99  $string = implode("\n", $result);
100
101  if ($is_html)
102  {
103    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
104  }
105
106  return nl2br($string);
107}
108
109function smarty_modifier_t_truncate_callback($string, $width, $etc = '')
110{
111  if (mb_strwidth($string) > $width)
112  {
113    $width = $width - mb_strwidth($etc);
114
115    // for Emoji
116    $offset = 0;
117    $tmp_string = $string;
118    while (preg_match('/\[[ies]:[0-9]{1,3}\]/', $tmp_string, $matches, PREG_OFFSET_CAPTURE))
119    {
120      $emoji_str = $matches[0][0];
121      $emoji_pos = $matches[0][1] + $offset;
122      $emoji_len = strlen($emoji_str);
123      $emoji_width = $emoji_len;
124
125      // a width by Emoji
126      $substr_width = mb_strwidth(substr($string, 0, $emoji_pos));
127
128      if ($substr_width >= $width)  // Emoji position is after a width
129      {
130        break;
131      }
132
133      if ($substr_width + 2 == $width)  // substr_width + Emoji width is equal to a width
134      {
135        $width = $substr_width + $emoji_width;
136        break;
137      }
138
139      if ($substr_width + 2 > $width)  // substr_width + Emoji width is rather than a width
140      {
141        $width = $substr_width;
142        break;
143      }
144
145      // less than a width
146      $offset = $emoji_pos + $emoji_len;
147      $width = $width + $emoji_width - 2;
148
149      $tmp_string = substr($string, $offset);
150    }
151
152    $string = mb_strimwidth($string, 0, $width, $etc, 'UTF-8');
153  }
154
155  return $string;
156}
157
158function op_diary_get_title_and_count($diary, $space = true, $width = 36)
159{
160  return sprintf('%s%s(%d)',
161           op_diary_truncate($diary->getTitle(), $width),
162           $space ? ' ' : '',
163           $diary->countDiaryComments()
164         );
165}
Note: See TracBrowser for help on using the repository browser.