読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

ブログシステムを作りたい

f:id:javascripter:20081211044356p:image
開発者向けのブログシステムを作りたい。まだデータ構造を考えている状態なので、HTMLに出力する時のエスケープは全くしていない。
index.cgi

#!/usr/bin/env ruby

require "erb"
require "yaml"
require "filter"

class Entries
  @@count = 0
  def initialize
    @entries = []
  end

  def load(path)
    Dir.chdir(path)
    Dir.glob("[0-9][0-9]/[0-1][0-9]/[0-3][0-9]/*") {|entry|
      file = open(entry)
      update = file.mtime
      content = Filter.run(file.read)
      @entries.push({
        "id" => entry,
        "content" => content,
        "title" => File.basename(entry),
        "update_readable" => update.to_s,
        "update" => update.strftime("%Y-%m-%dT%H:%M:%SZ"),
      })
    }
  end

  def each(&block)
    @entries.each(&block)
  end
end

config = YAML.load_file("/Users/javascripter/Sites/blog/config.yaml")
entries = Entries.new
entries.load("data/")

print("Content-Type: text/html\n\n")
ERB.new(open("/Users/javascripter/Sites/blog/template/page.rhtml").read).run(binding)

filter.rb

module Filter
  def self.run(source)
    source
  end
end

config.yaml

title: blog title
author: author
address: http://example.com/

template/page.rhtml

<html>
  <head>
    <title><%= config["title"] %></title>
  </head>
  <body>
    <h1><%= config["title"] %></h1>
    <% entries.each {|entry| %>
    <div class="hentry" id="<%= entry["id"] %>">
      <h2 class="entry-title">
        <a href="<%= "#" + entry["id"] %>" rel="bookmark"><%= entry["title"] %></a>
     </h2>
      <abbr class="update" title="<%= entry["update"] %>"><%= entry["update_readable"] %></abbr>
      <div class="entry-content">
        <%= entry["content"] %>
        <address class="author">
        <a href="<%= config["address"] %>"><%= config["author"] %></a>
        </address>
      </div>
    </div>
    <% } %>
  </body>
</html>

ディレクトリ全体は、

.
|-- config.yaml
|-- data
|   `-- 08
|       `-- 12
|           |-- 10
|           |   `-- first entry
|           `-- 11
|               `-- next entry
|-- filter.rb
|-- index.cgi
`-- template
    `-- page.rhtml

6 directories, 6 files

という感じ。

  1. 記事をエディタで編集できる
  2. CGIを使ってWebからも編集できる
  3. ソースコードとかを簡単に貼り付けられるように

といったことをコンセプトにしてる。
トラックバックやコメントを付けられるようにしたい。記事と同じディレクトリにfilename.trackbackを置くのは細分化されすぎな気がするので、どうするか思案中。
ソースコードの貼り付けは、はてなのスーパーpre記法をイメージしている。
スーパーpre記法はソースコードの更新が面倒なので、ソースのファイルが更新されるたびにインライン展開するというのがいいかも。

HTMLが更新されるのは、記事を更新した時やトラックバックが来た時だけだから、HTMLを動的に作るのではなく、rebuild.cgiとかを作って、HTMLファイル自体は静的にしたい。

あと、ページャとかも作らないといけないけど、意外といろいろ作るものがあって面倒だなあ。