有些Word文檔想搬到博客上來,而博客用的是markdown的格式。最簡單的辦法是在Word里轉成html格式另存為,因為markdown和html是兼容的。不過word直接另存為的html里面帶有“海量”的無聊樣式,實在不方便之后我們再用vim的工具編輯。所以還是想辦法整整。
相對來說,Word的docx格式比doc格式要容易處理,因為docx是微軟特意推出的open xml格式。其實就是記錄了文本內容的content.xml、附件media/*和對應附件路徑的_ref.xml等的zip包而已。所以相對必須在Windows平台上調用WIN32OLE的API來處理的doc來說,我們在linux平台上也可以很容易的處理docx文件了。比如rubygems上就有一個很不錯的gem叫ydocx
。一般的docx庫都是只抽取docx里的content文字,而這個ydocx很負責的把media/*也復制到docxname_files/images/*下面,並且在html里生成<img>
標簽了。
然后另一步就是把html轉換成markdown,這在github上也有現成的repo叫downmark_it。嗯,這名字一目了然就是反過來……
(ydocx
用的是nokogiri
,downmark\_it
用的是hpricot
,或許應該也改用nokogiri
比較好~不過nokogiri
官網可恥的被牆了)
首先安裝依賴
apt-get install libxslt1-dev libxml2-dev
gem install rubyzip htmlentities rmagick ydocx hpricot
wget https://raw.github.com/cousine/downmark_it/master/downmark_it.rb
編寫轉換腳本
require 'rubygems'
require 'ydocx'
$: << File.dirname(__FILE__)
require 'downmark_it'
filename = ARGV.shift
ydocx = YDocx::Document.open(filename)
html = ydocx.to_html.gsub(/\n/, '')
puts DownmarkIt.to_markdown(html)
這樣就能看到輸出了。目錄里的每個章節都有引用格式凸現,美中不足是對word里的標題樣式識別不太好,本來期望是可以自己生成<h1>
、<h2>
的,但是ydocx生成的html里只把第一個標題一變成<h1>
,其他的都是普通的<p>
。
另一個問題是上面腳本里直接調用to_html的方法,不會保存住unzip出來的images文件夾。自己再另寫一段unzip的代碼:
require 'fileutils'
require 'zip/zip'
require 'zip/zipfilesystem'
def unzip(zip_file, dest_dir)
Zip::ZipFile.open(zip_file) do |zf|
zf.each do |e|
path = File.join(dest_dir, e.name)
FileUtils.mkdir_p(File.dirname(path))
zf.extract(e, path) { true }
end
end
end
dirname = File.basename(filename, '.docx')
unzip(filename, "/tmp/#{dirname}")
FileUtils.mv("/tmp/#{dirname}/media/", "/images/")
FileUtils.rm_rf("/tmp/#{dirname}")
比較普通的辦法,是直接使用ydocx自帶的腳本docx2html --format none file.docx
,會在docx文檔的同級目錄下生成同名html和_files目錄。然后再寫一個單行腳本轉成markdown的。