#--------------------------------------------------------------------- # 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-20060719 $ # 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 \ \"dcstaff&\#64;&\#103;&\#102;&\#100;-dennou.org\"" # [JA] JA 用 HTML フッター (任意) # $(UpdateDateJA) は電脳 RD 書式で書かれた最上部の日時 # (JA part 部分内) # $(CreateDateJA) は電脳 RD 書式で書かれた最下部の日時 # (JA part 部分内) FOOTEREN = "
\ Gtool4 Development Group / GFD Dennou Staff \ \"dcstaff&\#64;&\#103;&\#102;&\#100;-dennou.org\"" # 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 ファイルの一番上の

の内容を # 読み取り, その内容を タグに代入する. # # さらに, <title>〜 (非アスキー文字を含む可能性あり) が # 指定よりも # 前に含まれる場合, この 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 <h1> to <title> ..' ; $(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: #