#! /usr/bin/env ruby
#
# hns2td.rb
# HyperNikkiSystem to tDiary converter
#
# Usage: ruby hns2rd hnf_files...
#
# ver 1.0.0  2001-09-16  kitaj, yamk
# ver 1.0.1  2001-09-17  yamk
# ver 1.0.2  2001-09-17  yamk          fixed SUB tag
# ver 1.1.0  2001-09-19  yamk          append TENKI, SUIMIN tag.
# ver 1.1.1  2001-09-26  yamk          append text_save
# ver 1.1.2  2002-01-14  kazuhiko      support IMG, LIMG tag etc.
# ver 1.1.3  2002-02-08  kazuhiko      support MARK tag
#                                      support image alignment
#                                      support footnote plugin
# ver 1.2.0  2002-02-03  sugi          fixed: for tdiary 1.5.x
#                                      support: CODE, EM tag
# ver 1.2.1  2002-02-03  sugi          fixed: LNEW with categoryname
#                                      fixed: STRIKE quote bug
#                                      support: LSUB tag
#                                      *SUB changed: b -> h4
#

$KCODE = 'e'

require 'tdiary'

module TDiary
  class TDiaryConvert < TDiaryBase
    def hns2tdiary_conv(body)
      bodyTmp = ''
      cat = ''
      count = 0
      newSubSection = true
      listMode = false
      preMode = false
      blockMode = false
      hnsUrl = %r|(http://www.archi.kyoto-u.ac.jp/~kazuhiko/diary/)?\?.+&amp;to=\d+\#(\d{8})(\d+)|
	titleTmp = ''
      
      body.each do |sLine|
	sLine.chomp!
#       sLine.gsub!(/&/, '&amp;')
	sLine.gsub!(/</, '&lt;')
	sLine.gsub!(/>/, '&gt;')
	sLine.gsub!(/\"/, '&quot;')
	
	case sLine
	when /^$/
	  next
	  
	when /^OK/
	  next
	  
	when /^\!\s*(.*)/
	  bodyTmp += '<!-- ' + $1 + "-->\n"
	  
	when /^\!#/
	  next
	  
	  # standard user variables
	when /WINE\s*(.*)/
	  bodyTmp += "お酒\n<p>\n#{$1}\n<\p>\n\n"
	  count += 1
	  
	when /MEAL\s*(.*)/
	  bodyTmp += "献立\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /TENKI\s*(.*)/
	  bodyTmp += "天気\n<p>\n#{$1}\n</p>\n\n"
	  count += 1

	when /BASHO\s*(.*)/
	  bodyTmp += "場所\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /TAIJU\s*(.*)/
	  bodyTmp += "体重\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /TAION\s*(.*)/
	  bodyTmp += "体温\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /SUIMIN\s*(.*)/
	  bodyTmp += "睡眠時間\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /BGM\s*(.*)/
	  bodyTmp += "BGM\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /HOSU\s*(.*)/
	  bodyTmp += "歩数\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /HON\s*(.*)/
	  bodyTmp += "読んだ本\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /KITAKU\s*(.*)/
	  bodyTmp += "帰宅時間\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /WALK\s*(.*)/
	  bodyTmp += "歩いた時間\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	when /RUN\s*(.*)/
	  bodyTmp += "ジョギング時間\n<p>\n#{$1}\n</p>\n\n"
	  count += 1
	  
	  # commands
	when /^CAT\s+(.+)/
	  cat = $1
	  
	when /^NEW\s?(.*)/
	  mes = $1
	  
	  if mes == ''
	    mes = ' '
	  end
	  if count > 0
	    bodyTmp += "\n\n"
	  end
	  count += 1
	  
	if cat != ''
	  bodyTmp += '[' + cat + '] '
	  cat = ''
	end
	  bodyTmp += mes + "\n"
	  newSubSection = true
	  
	when /^LNEW\s+(\S+)\s+(.+)/
	  link = $1
	  mes = $2
	  
	  # print "link=[#{link}]\n"
	  # Nikki Link
	  if hnsUrl =~ link
	    link = "?date=%s#p%02d" % [$2, $3]
	    # print "link=[#{link}]\n"
	  end
	  
	  if count > 0
	    bodyTmp += "\n\n"
	  end
	  count += 1
	  
	  if cat != ''
	    bodyTmp += '[' + cat + '] '
	    cat = ''
	  else
	    bodyTmp += '<'
	  end
	  bodyTmp += "<a href=\"#{link}\">#{mes}</a>\n"
	  newSubSection = true
	  
	when /^SUB\s+(.+)/
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  mes = $1
	  if count > 0
	    bodyTmp += "\n" if ! newSubSection
	  end
	  count += 1
	  bodyTmp += "<h4>* #{mes}</h4>\n"
	  newSubSection = true
	  
	when /^LSUB\s+(\S+)\s+(.+)/
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  url = $1
	  mes = $2
	  if count > 0
	    bodyTmp += "\n" if ! newSubSection
	  end
	  count += 1
	  bodyTmp += "<h4>* <a href=\"#{url}\">#{mes}</a></h4>\n"
	  newSubSection = true

	when /^LINK\s+(\S+)\s*(.*)/
	  link = $1
	  mes = $2
	  mes.sub!(/~$/, '')
	  
	  # nikki link
	  if hnsUrl =~ link
	    link = "?date=%s#p%02d" % [$2, $3]
	  end
	  
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "<a href=\"#{link}\">#{mes}</a>"
	  newSubSection = false

	when /^URL\s+(\S+)\s*(.*)/
	  link = $1
	  mes = $2
	  mes.sub!(/~$/, '')
	  
	  # Nikki Link
	  if hnsUrl =~ link
	    link = "?date=%s#p%02d" % [$2, $3]
	  end
	  
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += '<a href="#{link}">#{mes}(#{link})</a>'
	  newSubSection = false
	  
	when /^PRE/
	  bodyTmp += '</p>' if blockMode # !blockMode ???? fixme ????
	  bodyTmp += "\n" if ! newSubSection
	  bodyTmp += "<pre>\n"
	  preMode = true
	  newSubSection = false
	  
	when /^\/PRE/
	  bodyTmp += "</pre>\n"
	  preMode = false
	  newSubSection = true
	  
	when /^CODE/
	  bodyTmp += '</p>' if blockMode # !blockMode ???? fixme ????
	  bodyTmp += "\n" if ! newSubSection
	  bodyTmp += "<pre>\n"
	  preMode = true
	  newSubSection = false
	  
	when /^\/CODE/
	  bodyTmp += "</pre>\n"
	  preMode = false
	  newSubSection = true
	  
	when /^FONT\s+(\S+)\s+(\S+)\s(.+)/
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "<font #{$1}=\"#{$2}\">#{$3}</font>"
	  newSubSection = false

	when /^STRIKE\s+(.+)/
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "<strike>#{$1}</strike>"
	  newSubSection = false
	  
	when /^LSTRIKE\s+(\S+)\s+(.+)/
	  link = $1
	  mes = $2
	  mes.sub!(/~$/, '')
	  
	  # Nikki Link
	  if hnsUrl =~ link
	    link = "?date=%s#p%02d" % [$2, $3]
	  end
	  
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "\n<strike><a href=\"#{link}\">#{mes}</a></strike>\n"
	  newSubSection = false
	  
	when /^STRONG\s+(.+)/
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "<strong>#{$1}</strong>\n"
	  newSubSection = false
	  
	when /^EM\s+(.+)/
	  bodyTmp += '<p>' if newSubSection
	  bodyTmp += "<em>#{$1}</em>\n"
	  newSubSection = false

	when /^SPAN\s+(\S+)\s+(.+)/
	  bodyTmp += "\n<span class=\"#{$1}\">#{$2}</span>\n"
	  newSubSection = false
	  
	when /^DIV\s+(\S+)\s+(.+)/
	  bodyTmp += '</p>' if ! blockMode
	  bodyTmp += "\n<div class=\"#{$1}\">#{$2}"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/DIV/
	  bodyTmp += "</div>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^UL/
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  bodyTmp += "<ul>\n"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/UL/
	  bodyTmp += "</ul>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^OL/
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  bodyTmp += "<ol>\n"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/OL/
	  bodyTmp += "</ol>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^LI(?:\s+(.*))?/
	  mes = $1 || ""
	  mes.sub!(/~$/, "\n")
	  bodyTmp += '<li>' + mes
	  newSubSection = false
	  
	when /^DL/
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  bodyTmp += "<dl>\n"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/DL/
	  bodyTmp += "</dl>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^DT\s*(.*)/
	  mes = $1
	  mes.sub!(/~$/, "\n")
	  bodyTmp += '<dt>' + mes
	  newSubSection = false
	  
	when /^DD\s*(.*)/
	  mes = $1
	  mes.sub!(/~$/, "\n")
	  bodyTmp += '<dd>' + mes
	  newSubSection = false
	  
	when /^CITE\s*(.*)/
	  cite = $1
	  bodyTmp += '</p>' if ! blockMode && ! newSubSection
	  bodyTmp += "<blockquote"
	  bodyTmp += " cite=\"#{cite}\"" if cite != ''
	  bodyTmp += ">\n"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/CITE/
	  bodyTmp += "</blockquote>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^FN/
  #	bodyTmp += '<p>' if newSubSection
  #	bodyTmp += ' ('
	  bodyTmp += "<%=fn \'"
	  newSubSection = false
	  
	when /^\/FN/
  #	bodyTmp += ') '
	  bodyTmp += "\' %>"
	  newSubSection = false

	when /^P$/
	  bodyTmp += "<p>\n"
	  newSubSection = false
	  blockMode = true
	  
	when /^\/P$/
	  bodyTmp += "\n</p>\n"
	  newSubSection = true
	  blockMode = false
	  
	when /^IMG\s+(\S)\s+(.+)/
	  imgsrctmp = $2
	  if $1 == "l"
	    align = ' align="left"'
	  elsif $1 == "r"
	    align = ' align="right"'
	  else
	    align = ''
	  end
	  if /(\S+)\s+(\S+)/ =~ imgsrctmp
	    imgsrc = $1
	    alt = $2
	  else
	    imgsrc = imgsrctmp;
	    alt = '[' + imgsrctmp.sub(/.*\//, '') + ']'
	  end
	  bodyTmp += "\n<img src=\"#{imgsrc}\" alt=\"#{alt}\"#{align}>\n"
	  newSubSection = false
	  
	when /^LIMG\s+(\S+)\s+(\S)\s+(.+)/
	  url = $1
	  imgsrctmp = $3
	  if $2 == "l"
	    align = ' align="left"'
	  elsif $2 == "r"
	    align = ' align="right"'
	  else
	    align = ''
	  end
	  if /(\S+)\s+(\S+)/ =~ imgsrctmp
	    imgsrc = $1
	    alt = $2
	  else
	    imgsrc = imgsrctmp;
	    alt = '[' + imgsrctmp.sub(/.*\//, '') + ']'
	  end
	  bodyTmp += "\n<a href=\"#{url}\">"
	  bodyTmp += "<img src=\"#{imgsrc}\" alt=\"#{alt}\"#{align}>"
	  bodyTmp += "</a>\n"
	  newSubSection = false

	when /^MARK\s+(\S+)/
	  if $1 == '(^^)'
	    bodyTmp += "\n<img src=\"icons/smile.png\" alt=\"#{$1}\">\n"
	  elsif $1 == '(;_;)'
	    bodyTmp += "\n<img src=\"icons/cry.png\" alt=\"#{$1}\">\n"
	  elsif $1 == '(X_X)'
	    bodyTmp += "\n<img src=\"icons/angry.png\" alt=\"#{$1}\">\n"
	  end
	  newSubSection = false
	  
	else
	  bodyTmp += '<p>' if newSubSection && ! blockMode
	  if /~$/ =~ sLine
	    sLine.sub!(/~$/, '')
	    sLine += "<br>\n"
	    newSubSection = true
	  else
	    newSubSection = false
	  end
	  
	  bodyTmp += sLine
	  bodyTmp += "\n" if preMode
	end
      end
      
      @title = titleTmp.chomp
      bodyTmp
    end

    def initialize( cgi, rhtm, confl )
      super
    end

    def convert(filename)
      y, m, d = filename.scan(/(\d\d\d\d)(\d\d)(\d\d)/)[0]
      @date = Time::local y, m, d
      @body = File::readlines(filename).join.to_euc
      @title = ''
      
      @io.transaction(@date) do |diaries|
	@body = hns2tdiary_conv(@body);
	@diaries = diaries
	@diary = self[@date]
	olddata = @diaries[@date.strftime("%Y%m%d")]
	if nil != olddata
	  olddata.replace(@date, @title, @body);
	  @diary = olddata;
	else
	  @diary = @io.diary_factory(@date, @title, @body)
	end
	@diary.show(true)
	self << @diary
	DIRTY_DIARY
      end
    end
  end
end

tdiary = TDiary::TDiaryConvert.new(nil, nil, TDiary::Config.new)

ARGV.each do |f|
  tdiary.convert f
end
