#---------------------------------------------------------------------
# Copyright (C) GFD Dennou Club, 2005. All rights reserved.
#---------------------------------------------------------------------
#= Generate HTML from RD
#
# Authors:: Yasuhiro MORIKAWA
# Version:: $Id: Makefile.rd2html,v 1.9 2006/06/04 03:39:17 morikawa Exp $
# Tag Name:: $Name: gt4f90io-20060725 $
# Copyright:: Copyright (C) GFD Dennou Club, 2004-2005. All rights reserved.
# License:: See COPYRIGHT[link:COPYRIGHT]
#
# in Config.mk, DEST_DOC is defined
#
#== History
#
# * 2006/05/31 (Yasuhiro MORIKAWA) Updated
# * 2005/12/29 (Yasuhiro MORIKAWA) Downloaded from http://www.gfd-dennou.org/library/dcmodel/doc/sample_Makefile/Makefile.rd2html
#
######################################################################
#
#== Settings
#
# [JAPANESE] 各種設定項目
INCLUDEFILE =
include $(INCLUDEFILE) # Include file (optional)
# [JA] インクルードファイル (任意)
JA = 1 # 1: Create "htm", 0: Not Create (selective)
EN = 1 # 1: Create "htm.en", 0: Not Create (selective)
# [JA] 1 ならば作成, 0 ならば作成しない (選択必須)
RDHINDEX = 1 # Index of Headers (selective)
# 0:None, 1-3:Header Level
# Note: CSS item is "ol.rd2html_hindex [ul ..]"
#
# [JA] ヘッダの目次 (選択必須)
# 0:作成しない, 1-3:ヘッダレベルに対応
# 備考: CSS 設定は "ol.rd2html_hindex [ul ..]" で
#HEADERJA = "[ 地球流体電脳倶楽部 /\
# dcmodel /\
# SIGEN.htm ]"
# # [JA] JA 用 HTML ヘッダー (任意)
#
#HEADEREN = "[ GFD Dennou Club /\
# dcmodel ]"
# # HTML Header (optional)
FOOTERJA = "
\
gtool4 Development Group / GFD Dennou Staff \
"
# [JA] JA 用 HTML フッター (任意)
# $(UpdateDateJA) は電脳 RD 書式で書かれた最上部の日時
# (JA part 部分内)
# $(CreateDateJA) は電脳 RD 書式で書かれた最下部の日時
# (JA part 部分内)
FOOTEREN = "
\
Gtool4 Development Group / GFD Dennou Staff \
"
# HTML Footer (optional)
# $(UpdateDateEN) is date in Dennou RD on top (EN part)
# $(CreateDateEN) is date in Dennou RD at bottom (EN part)
CSS = gt4f90io.css
# Cascade Style Sheet (necessary)
# [JA] カスケードスタイルシート (必須)
CHMOD = 664 # Set mode (optional)
# [JA] chmod する値 (任意)
CHGRP = # Set group (optional)
# [JA] chgrp する値 (任意)
RUBY = ruby1.8 # Path to Ruby (necessary)
# [JA] Ruby へのパス (必須)
RD = rd2 # Path to rdtool (necessary)
# [JA] rdtool へのパス (必須)
RD2LIB = rd/rd2html-lib # 標準ライブラリ
#RD2LIB = rd/rd2html-ext-lib # 拡張ライブラリ
# Library of rd2html (selective)
# [JA] rd2html ライブラリ (選択)
RUBYLIB =
# Set "RUBYLIB" (optional)
# [JA] "RUBYLIB" の設定 (任意)
RDOPTS = --with-part=TOPLINK:rd
# Additional rd2 options (optional)
# [JA] rd2 コマンドへのオプション (任意)
OUTCODE = euc # character encoding of output [jis|euc|sjis] (necessary)
# [JA] rd 出力時の文字コード [jis|euc|sjis] (必須)
JACODE = EUC-JP # indicate CHARSET as charset [char encoding] (necessary)
# [JA] rd2 コマンドの CHARSET (必須)
# End Settings [JA] 設定項目ここまで
######################################################################
#== Commands
# General command
RD2HTM = rd2 -r $(RD2LIB) --with-css=$(CSS) --with-part=HTML:html \
--out-code=$(OUTCODE) $(RDOPTS)
# For Japanese
RD2JA = $(RD2HTM) --html-charset=$(JACODE) --with-part=JA:rd
# For English
RD2EN = $(RD2HTM) --html-charset=US-ASCII --with-part=EN:rd
######################################################################
#== Ruby liner script for replacing title in HTML
#
# [JA] 引数 (1 つのみ) にとった HTML ファイルの一番上の
の内容を
# 読み取り, その内容を タグに代入する.
#
# さらに, 〜 (非アスキー文字を含む可能性あり) が
# 指定よりも
# 前に含まれる場合, この 2 つを入れ替える.
#
H1ToTitle = $(RUBY) -e 'body = open(ARGV[0]){|io| io.read}; \
if /\(.*?)\<\/h1.*?\>/ =~ body then ;\
h1 = $$1 ;\
h1 = h1.chomp.gsub!(/\<.*?\>/){|s| s = ""} ;\
mod = body.gsub(/\.*<\/title\>/, \
"\" + h1 + "<\/title\>") ;\
else ;\
mod = body ;\
end ;\
\
if /(\.*?\<\/title\>)/im =~ mod then ;\
title = $$1 ;\
if /(\)/im =~ body then ;\
meta = $$1 ;\
mod.sub!(/\#{meta}/im, title) ;\
mod.sub!(/\#{title}/im, meta) ;\
end ;\
end ;\
\
out = open(ARGV[0], "w"); out.puts(mod) ;\
out.close'
######################################################################
#== Ruby liner script for add header to existing HTML
#
# [JA] 1 つ目の引数にとった文字列を既存の HTML ファイル (2 つめの引数)
# の タグ直下に挿入する.
#
InsHeader = $(RUBY) -e 'body = open(ARGV[1]){|io| io.read}; \
mod = body.sub(/\/, \
"\\n\n" + ARGV[0].to_s) ;\
out = open(ARGV[1], "w"); out.puts(mod) ;\
out.close'
######################################################################
#== Ruby liner script for add footer to existing HTML
#
# [JA] 1 つ目の引数にとった文字列を既存の HTML ファイル (2 つめの引数)
# の タグ直下に挿入する.
#
InsFooter = $(RUBY) -e 'body = open(ARGV[1]){|io| io.read}; \
mod = body.sub(/\<\/body\>/, \
ARGV[0].to_s + "\n\n\") ;\
out = open(ARGV[1], "w"); out.puts(mod) ;\
out.close'
######################################################################
#== Ruby liner script for getting JA part
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, =begin, =end でくくられた部分と =begin JA, =end JA
# でくくられた部分を標準出力に出力する.
#
JAPart = $(RUBY) -e 'inbody = false ;\
puts "=begin" ;\
lines = readlines ;\
lines.each {|line| ;\
inbody = true if /^=begin\s*$$/ =~ line ;\
inbody = true if /^=begin\s+JA\s*$$/ =~ line ;\
inbody = false if /^=end\s*$$/ =~ line ;\
inbody = false if /^=end\s+JA\s*$$/ =~ line ;\
next if line =~ /^=(begin|end)\s*$$/ ;\
next if line =~ /^=(begin\s+|end\s+)\w+\s*$$/ ;\
if inbody ;\
puts line ;\
end ;\
} ;\
puts "=end"'
######################################################################
#== Ruby liner script for getting EN part
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, =begin, =end でくくられた部分と =begin EN, =end EN
# でくくられた部分を標準出力に出力する.
#
ENPart = $(RUBY) -e 'inbody = false ;\
puts "=begin" ;\
lines = readlines ;\
lines.each {|line| ;\
inbody = true if /^=begin\s*$$/ =~ line ;\
inbody = true if /^=begin\s+EN\s*$$/ =~ line ;\
inbody = false if /^=end\s*$$/ =~ line ;\
inbody = false if /^=end\s+EN\s*$$/ =~ line ;\
next if line =~ /^=(begin|end)\s*$$/ ;\
next if line =~ /^=(begin\s+|end\s+)\w+\s*$$/ ;\
if inbody ;\
puts line ;\
end ;\
} ;\
puts "=end"'
######################################################################
#== Ruby liner script for getting creation date in Dennou RD format
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, "* 2005/08/10 (氏名) ..." のように記述される一連の
# 文字列から一番下の日付を標準出力に出力する.
#
CDateParser = $(RUBY) -e 'lines = readlines ;\
start = false ;\
date = "" ;\
lines.each{ |line| ;\
if /^\s*\#*\s*\*\s+(\d{2,4}[\/\-]\d{1,2}[\/\-]\d{1,2})\s+\(.+\)/ =~ line then ;\
start = true ;\
date = $$1 ;\
else ;\
if start then ;\
$$stdout.print date ;\
exit ;\
end ;\
end ;\
} ;\
$$stdout.print "unknown" ;\
exit'
CreateDateJA = `$(JAPart) $< | $(CDateParser)`
CreateDateEN = `$(ENPart) $< | $(CDateParser)`
######################################################################
#== Ruby liner script for getting update date in Dennou RD format
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, "* 2005/08/10 (氏名) ..." のように記述される一連の
# 文字列から一番上の日付を標準出力に出力する.
UDateParser = $(RUBY) -e 'lines = readlines ;\
lines.each{ |line| ;\
if /^\s*\#*\s*\*\s+(\d{2,4}[\/\-]\d{1,2}[\/\-]\d{1,2})\s+\(.+\)/ =~ line then ;\
$$stdout.print $$1 ;\
exit ;\
end ;\
} ;\
$$stdout.print "unknown" ;\
exit'
UpdateDateJA = `$(JAPart) $< | $(UDateParser)`
UpdateDateEN = `$(ENPart) $< | $(UDateParser)`
######################################################################
#== Ruby liner script for getting creator in Dennou RD format
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, "* 2005/08/10 (氏名) ..." のように記述される一連の
# 文字列から一番下の氏名を標準出力に出力する.
#
CUserParser = $(RUBY) -e 'lines = readlines ;\
start = false ;\
user = "" ;\
lines.each{ |line| ;\
if /^\s*\#*\s*\*\s+(\d{2,4}[\/\-]\d{1,2}[\/\-]\d{1,2})\s+\((.+?)\)/ =~ line then ;\
start = true ;\
user = $$2 ;\
else ;\
if start then ;\
$$stdout.print user ;\
exit ;\
end ;\
end ;\
} ;\
$$stdout.print "unknown" ;\
exit'
CreateUserJA = `$(JAPart) $< | $(CUserParser)`
CreateUserEN = `$(ENPart) $< | $(CUserParser)`
######################################################################
#== Ruby liner script for getting updater in Dennou RD format
#
# [JA] 引数 (複数可) または引数が無い場合標準入力から得られた文字列
# のうち, "* 2005/08/10 (氏名) ..." のように記述される一連の
# 文字列から一番上の氏名を標準出力に出力する.
UUserParser = $(RUBY) -e 'lines = readlines ;\
lines.each{ |line| ;\
if /^\s*\#*\s*\*\s+(\d{2,4}[\/\-]\d{1,2}[\/\-]\d{1,2})\s+\((.+?)\)/ =~ line then ;\
$$stdout.print $$2 ;\
exit ;\
end ;\
} ;\
$$stdout.print "unknown" ;\
exit'
UpdateUserJA = `$(JAPart) $< | $(UUserParser)`
UpdateUserEN = `$(ENPart) $< | $(UUserParser)`
######################################################################
#== Ruby liner script for getting RD Header index
#
# Reference: http://www.rubyist.net/~rubikitch/computer/rd-hindex/
#
# [JA] 標準入力内から目次を取得し, 1 つ目の引数をファイル名として
# 受け取り, そのファイル内の == より前に目次を組み込んだ内容を
# 標準出力に出力する.
# 2 つ目の引数は目次として取り込むヘッダのレベルの指定である.
# 1 〜 3 までが有効で, 0 や文字列などが代入された場合,
# 目次は組み込まれない.
# 3 つ目の引数は part の指定で, もしも本文が JA part 内にある場合は
# JA などと指定する.
# なお, 目次の ol には =begin HTML
# =end HTMLというタグが入る.
#
# 参考: http://www.rubyist.net/~rubikitch/computer/rd-hindex/
#
RDHindexParser = $(RUBY) -e \
'rdlevel = ARGV[1].to_i ;\
rdhindex = "=begin HTML\n
\n\n=end HTML\n" ;\
rdhindex << "=begin\n" ;\
while line = $$stdin.gets ;\
next if line =~ /^=(begin|end)$$/ ;\
if line =~ /^(=+)\s*(.+)$$/ ;\
level = $$1.length ; content = $$2 ;\
next if level == 1 || level > rdlevel + 1 ;\
rdhindex << " " * (level - 2) + "* ((<\"\#{content}\">))\n" ;\
end ;\
end ;\
rdhindex << "=end\n" ;\
rdhindex << "=begin HTML\n
\n
\n=end HTML\n" ;\
rdhindex = "" if rdlevel == 0 ;\
;\
body = open(ARGV[0]){|io| io.read} ;\
lines = body.split(/\n/) ;\
finished = false ; inbody = false ;\
results = "" ; rdbegin = "" ; rdend = "" ;\
lines.each{ |line| ;\
if line =~ /^=begin$$/ ;\
rdbegin = "=begin" ; rdend = "=end" ;\
elsif line =~ /^=begin\s+(.*)/ ;\
rdbegin = "=begin " + $$1 ; rdend = "=end " + $$1 ;\
end ;\
if line =~ /^=end$$/ || line =~ /^=end\s+(.*)/ ;\
rdbegin = "" ; rdend = "" ;\
end ;\
inbody = true if line =~ /^=begin$$/ || line =~ /^=begin\s+\#{ARGV[2]}$$/ ;\
inbody = false if line =~ /^=end(\s+\w+)*$$/ ;\
if /^==\s+/ =~ line && !(finished) && inbody then ;\
results << rdend + "\n" + rdhindex + "\n" + rdbegin + "\n" ;\
results << line + "\n" ;\
finished = true ;\
else ;\
results << line + "\n" ;\
end ;\
} ;\
puts results'
######################################################################
#== Postprocessor for RDHindexParser
#
# [JA] RDHindexParser で XHTML 1.0 Transitional 違反となってしまう部分を
# 修正する後処理スクリプト.
# 標準入力から HTML を受け取り, 違反項目を置換した後,
# その結果を標準出力へ返す.
RDHindexPostProcessor = $(RUBY) -e \
'lines = readlines ;\
body = lines.join ;\
body.gsub!(/(\)\s*\/im, "\\1" ) ;\
body.gsub!(/\<\/ul\>\s*\<\/ol\>/im, "\
") ;\
puts body'
######################################################################
#== Search "rd" files
__AllRDFiles__ = $(wildcard *.rd)
RDFiles = $(__AllRDFiles__:%.v.rd=)
GenerateFiles = $(HtmByJA) $(HtmByEN)
HtmByJA = $(RDFiles:.rd=.htm)
HtmByEN = $(RDFiles:.rd=.htm.en)
##########################################################################
#== Rules
#
all: pathcheck $(GenerateFiles)
help:
@echo ""
@echo " This Makefile needs following programs."
@echo ""
@echo " Ruby "
@echo " rdtool "
@echo ""
@echo ""
@echo " make [all] :"
@echo " Create HTML files from RD "
@echo ""
%.htm: %.rd
@if [ $(JA) != "0" ] ; then \
echo -n "Insert RD Header Index Level:$(RDHINDEX) Part:JA .." ;\
$(JAPart) $< | $(RDHindexParser) $< "$(RDHINDEX)" JA > $<.rdhindex.tmp ;\
echo ' done' ;\
echo "$(RD2JA) $< > $@ || rm -f $@" ;\
$(RD2JA) $<.rdhindex.tmp | $(RDHindexPostProcessor) > $@ || rm -f $@ ;\
rm -f $<.rdhindex.tmp ;\
if [ -f $@ ]; then \
echo -n 'Copy to ..' ; $(H1ToTitle) $@ ; echo 'done' ;\
if [ ! X$(HEADERJA) = X"" ] ; then \
echo -n 'Add header ..' ;\
$(InsHeader) $(HEADERJA) $@ ;\
echo ' done' ;\
fi ;\
if [ ! X$(FOOTERJA) = X"" ] ; then \
echo -n 'Add footer ..' ;\
$(InsFooter) $(FOOTERJA) $@ ;\
echo ' done' ;\
fi ;\
fi ;\
if [ ! X$(CHMOD) = X"" ]; then \
echo -n chmod $(CHMOD) $@ .. ; chmod $(CHMOD) $@ ; echo ' done' ;\
fi ;\
if [ ! X$(CHGRP) = X"" ]; then \
echo -n chgrp $(CHGRP) $@ .. ; chgrp $(CHGRP) $@ ; echo ' done' ;\
fi ;\
fi
%.htm.en: %.rd
@if [ $(EN) != "0" ] ; then \
echo -n "Insert RD Header Index Level:$(RDHINDEX) Part:EN .." ;\
$(ENPart) $< | $(RDHindexParser) $< "$(RDHINDEX)" EN > $<.rdhindex.tmp ;\
echo ' done' ;\
echo "$(RD2EN) $< > $@ || rm -f $@" ;\
$(RD2EN) $<.rdhindex.tmp | $(RDHindexPostProcessor) > $@ || rm -f $@ ;\
rm -f $<.rdhindex.tmp ;\
if [ -f $@ ]; then \
echo -n 'Copy to ..' ; $(H1ToTitle) $@ ; echo ' done' ;\
if [ ! X$(HEADEREN) = X"" ] ; then \
echo -n 'Add header ..' ;\
$(InsHeader) $(HEADEREN) $@ ;\
echo ' done' ;\
fi ;\
if [ ! X$(FOOTEREN) = X"" ] ; then \
echo -n 'Add footer ..' ;\
$(InsFooter) $(FOOTEREN) $@ ;\
echo ' done' ;\
fi ;\
fi ;\
if [ ! X$(CHMOD) = X"" ]; then \
echo -n chmod $(CHMOD) $@ .. ; chmod $(CHMOD) $@ ; echo ' done' ;\
fi ;\
if [ ! X$(CHGRP) = X"" ]; then \
echo -n chgrp $(CHGRP) $@ .. ; chgrp $(CHGRP) $@ ; echo ' done' ;\
fi ;\
fi
clean:
@if [ ! X"$(wildcard *~ *.bak)" = X"" ]; then \
echo rm $(wildcard *~ *.bak) ;\
rm $(wildcard *~ *.bak) ;\
fi
clean.all: clean
@if [ ! X"$(wildcard $(GenerateFiles))" = X"" ]; then \
echo rm $(wildcard $(GenerateFiles)) ;\
rm $(wildcard $(GenerateFiles)) ;\
fi
pathcheck:
@echo -n "Ruby path check .. "
@if ! which $(RUBY) > /dev/null 2>&1 ; then \
echo "" ;\
echo " Error: RUBY=\"$(RUBY)\" is invalid path." ;\
echo "" ;\
echo " Please install Ruby (see http://www.ruby-lang.org), " ;\
echo " or set valid path." ;\
echo "" ;\
exit 1 ;\
fi
@echo " done"
@echo -n "RD path check .. "
@if ! which $(RD) > /dev/null 2>&1 ; then \
echo "" ;\
echo " Error: RD=\"$(RD)\" is invalid path." ;\
echo "" ;\
echo " Please install RDtool (see http://raa.ruby-lang.org/project/rdtool/), " ;\
echo " or set valid path." ;\
echo "" ;\
exit 1 ;\
fi
@echo " done"
######################################################################
#== Mode setting for Emacs
#Local Variables:
#mode: makefile
#End:
#