学習日記73日目 - Blogapp vol.9 -

スタートアップ研修記はこちらです。

どうも、enomotoです。
今日ももうやんです。もうやんは最高です。
もうやんなしでは…そんなもうやん依存症の叫びはどっかに投げ捨てて
今日ははてな文法で日記の修飾をできるようにしたいと思います。

はてな文法を使えるようにする。

調べてみたら、HatenaSyntaxを使えばあっさりできてしまうみたい。
HatenaSyntax \ Package \ Openpear
HatenaSyntaxにはPEGパッケージが必要なのでこれも導入する。
PEG \ Package \ Openpear
どちらもopenpear上にあるのでチャネルを追加する。

pear channel-discover openpear.org

PEGとHatenaSyntaxを導入する。

sudo pear install openpear/PEG-beta
sudo pear install openpear/HatenaSyntax-beta

あとはさくっとテンプレートに追加してみた。

<?php require_once('HatenaSyntax.php'); echo HatenaSyntax::render($article->getBody()) ?>

これだけでもうはてな文法がHTMLタグに変換されていった><

区切りを任意の場所でしたい。

たとえば、この日記で"続きを読む"ってありますよね。
====を書けばそこが区切りになって====以降はトップページでは表示しないものです。
これを再現したい。
ということでやってみた。
新しいヘルパーHatenaHelper.phpを作成。

<?php

require_once('HatenaSyntax.php');

function hatenasyntax($article) {
  $article_body = preg_replace('/====/','',$article->getBody());
  return HatenaSyntax::render($article_body);
}

function hatenasyntax_list($article) {
  $article_body = preg_split('/====/',$article->getBody());
  if(isset($article_body[1])) {
  return HatenaSyntax::render($article_body[0]).'<p class="more">'.link_to('&gt;&gt; 続きを読む','article/show?id='.$article->getId()).'</p>';
  } else {
    return HatenaSyntax::render($article_body[0]);
  }
}

リストの部分は↓に置き換えて

<?php use_helper('mbText','Hatena') ?>
〜中略〜
    <?php echo hatenasyntax_list($article) ?>
〜省略〜

記事画面の部分は↓に置き換えた。

<?php use_helper('Hatena') ?>
〜中略〜
    <?php echo hatenasyntax($article) ?>
〜省略〜

で、こうなった。


おーできた。

投稿アクションを直す。

前回ダメなやり方を使って強引にタグが投稿できるようにしましたが、
さすがにこれは不味いので手直ししました。

  protected function updateArticleFromRequest()
  {
    //$usersid = $this->getUser()->getSubscriberId();
    $usersid = 1;
    // まずは投稿者IDをセット
    $this->article->setUserId($usersid);
    // getRequestParameterする。
    $article = $this->getRequestParameter('article');
    $tag = htmlspecialchars($this->getRequestParameter('tag'));
    // タイトルと内容を保存
    if(isset($article['title']) && $article['title'] != '') {
      $this->article->setTitle(htmlspecialchars($article['title']));
    } else {
      $this->article->setTitle('no title');
    }
    if(isset($article['body']) && $article['body'] != '') {
      $this->article->setBody(htmlspecialchars($article['body']));
    } else {
      $this->article->setBody('no body');
    }
    $this->article->save();
    $date = $this->article->getCreatedAt('Ymd');
    $update = $this->article->getUpdatedAt('Ymd');
    // 既にタグがある場合は$checkに入れる。
    $check = ArticlePeer::retrieveByPk($this->getRequestParameter('id'));
    // 記事IDを呼び出す
    $articleid = $this->article->getId();
    // 普通のタグ挿入(タグがセットされているときのみ動作)
    if (isset($tag) && $tag != '') {
      $this->article_tag = new ArticleTag();
      $this->article_tag->setUserId($usersid);
      $this->article_tag->setArticleId($articleid);
      $this->article_tag->setTag($tag);
      $this->article_tag->setNormalizedTag(Tag::normalize($tag));
      // 保存
      $this->article_tag->save();
    }
    // ここから日付タグ(dateとupdateが同じ日のみで$checkが空のときに動作)
    if ($date === $update && !$check) {
      $this->article_tag = new ArticleTag();
      $this->article_tag->setUserId($usersid);
      $this->article_tag->setArticleId($articleid);
      $this->article_tag->setTag($date);
      $this->article_tag->setNormalizedTag(Tag::normalize($date));
      // 保存
      $this->article_tag->save();
    }
  }