# coding: utf-8 # Rakefile for Markdown documents. DIRMAP_MD = '.dirmap.md' HTML2PDF = "wkhtmltopdf -B 1cm -L 1.5cm -R 1.5cm -T 1.5cm -s A4 --encoding UTF-8 " TEX2IMAGE = "tex2image" IMAGEMAGICK = "convert -alpha deactivate -density 144x144" INKSCAPE = "inkscape" require "pp" require "fileutils" require "pathname" require "tempfile" require "rake/clean" ## .dirmap.md # dirmap コマンドは必ず実行なので task タスク。 # これを file にすると存在するときに実行されない。 # 生成物の .dirmap.md から task タスクへの依存を設定すると、 # .dirmap.md に依存する file タスクに「必ず実行」が伝播して必ず実行になってしまう。 # DIRMAP_MD というファイルに対する file タスクへの依存として扱うことで、 # .dirmap.md に依存する file タスクに「必ず実行」が伝播するのを防いでいる。 desc "update .dirmap.md if directory changed." file DIRMAP_MD => :dirmap_command task :dirmap_command do sh "dirmap --kakasi" end ## *.html md_files = FileList["*.md"] html_files = md_files.ext("html") html_tasks = [] html_files.each do |html_file| md_file = html_file.ext("md") md_path = Pathname.new( md_file) dirpath = md_path.dirname src = FileList[md_file, DIRMAP_MD] file html_file => [DIRMAP_MD, md_file] do puts "Update: #{md_file} -> #{html_file}" side_lines = `pandoc #{DIRMAP_MD}`.split("\n") side_lines.unshift "" line = `pandoc -s -N --toc -c madowu.css --mathjax --filter pandoc-crossref #{md_file}` lines = line.split("\n") end_body = lines.index('') lines.insert(end_body, side_lines) lines.flatten # -N = --number-sections # -s = --standalone File.open(html_file, "w") {|io| io.puts lines} end html_tasks << html_file end CLEAN.include(html_files) desc "make *.html from *.md" task :md2html => [DIRMAP_MD, * html_tasks] # recursive だと、サブディレクトリの Rakefile も # recursive ターゲットを持っているという前提が必要。 desc "execute 'rake' in all subdirs with Rakefile" rakefiles = FileList["**/Rakefile"] dirs = rakefiles.map{|path| Pathname.new(path).dirname.to_s} #dirs.delete_if {|i| i == '.' } dirs.map!{|path| File.absolute_path(path)} #pp dirs; exit task :subdir do dirs.each do |dir| puts "■" + dir Dir.chdir dir system "rake" end end ############################################################ ## extension rules ## src_exts: array of the extentions that the destination file depends on. ## src_exts[0] is used as a 'src' of rake target. def rule_src2dst(src_exts, dst_ext) desc "convert from .#{src_exts[0]} to #{dst_ext}." dst_files = [] FileList["*.#{src_exts[0]}"].each do |src_file| dst_file = src_file.ext(dst_ext) basename = File.basename(src_file, ".#{src_exts[0]}") src_files = src_exts.map {|ext| FileList["#{basename}.#{ext}"]}.flatten src_files.select!{|path| FileTest.exist? path } file dst_file => src_files do yield(src_files, dst_file) end dst_files << dst_file end task "#{src_exts[0]}2#{dst_ext}".to_sym => dst_files CLEAN.include(dst_files) end rule_src2dst(['pov'], 'png') { |srcs, dst| sh "povray -D #{srcs[0]}"} rule_src2dst(['eps'], 'png') { |srcs, dst| sh "#{IMAGEMAGICK} #{srcs[0]} #{dst}"} rule_src2dst(['dot'], 'png') { |srcs, dst| sh "dot -Tpng #{srcs[0]} -o #{dst}"} rule_src2dst(['tex'], 'png') { |srcs, dst| sh "#{TEX2IMAGE} #{srcs[0]}" } rule_src2dst(['svg'], 'eps') { |srcs, dst| sh "#{INKSCAPE} -T -z -E #{dst} #{srcs[0]}" } rule_src2dst(['svg'], 'png') { |srcs, dst| #直接 png にすると、透明背景で余白ありになる。 eps_file = Tempfile.new.path sh "#{INKSCAPE} -T -z -E #{eps_file} #{srcs[0]}" sh "#{IMAGEMAGICK} #{srcs[0]} #{dst}" FileUtils.rm eps_file } rule_src2dst(['rb', 'dat'] , 'png') { |srcs, dst| sh "ruby #{srcs[0]}" } rule_src2dst(['rb', 'dat'] , 'eps') { |srcs, dst| sh "ruby #{srcs[0]} --eps"} rule_src2dst(['plt', 'dat'] , 'eps') { |srcs, dst| sh "gnuplot ./#{srcs[0]}"} rule_src2dst(['html'], 'pdf') { |srcs, dst| sh "#{HTML2PDF} #{srcs[0]} #{dst}"} ############################################################ #task :all => [:md2html, :subdir] task :default => [:md2html, :tex2png, :svg2png, :rb2png, :pov2png, :dot2png] # 基本方針として、html を生成するのをデフォルトとする。 # :eps2png は、rb2eps と rb2png の関係に干渉する # :plt2eps