最近拿 deplate 重新制作了个人主页(www.chenshuo.com),其间对 deplate 0.7.3 做了不少改动,记录在这里,备查。头一次用 ruby,可能方法比较笨拙,见笑。
1. 禁用符号替换。根据 deplate 手册第 9.10 节,它会自动把 ->、<=、!= 等等符号替换为单个字符,而这些符号在程序代码中经常出现,不能替换。这个工作由 fmt/hrml.rb 的 format_symbol(invoker, text) 函数负责,修改办法是:
class Deplate::Formatter::HTML < Deplate::Formatter
def format_symbol(invoker, text)
case text
# 已拿掉这里一截代码
when "+++", "###", "???", "!!!"
m = plain_text(text)
return %{#{m}}
# when "<~"
# return ""
# when "~>"
# return ""
# when "<~>"
# return ""
else
return plain_text(text)
end
end
...
2. 禁用引号替换,在默认情况下,deplate 会把 "string" 替换为 “string”,这是我不想要的,修改办法是:
class Deplate::Formatter::HTML < Deplate::Formatter
def doublequote_open(invoker)
'"'
end
def doublequote_close(invoker)
'"'
end
def singlequote_open(invoker)
"'"
end
def singlequote_close(invoker)
"'"
end
...
3. 允许给标题设置超链接。修改办法是:
class Deplate::Formatter::HTML < Deplate::Formatter
def format_heading(invoker)
l = format_label(invoker, nil, nil, false)
level = invoker.level
args = invoker.args
elt = invoker.elt
html_args = invoker.html_args || ''
id = invoker.get_id
if consume_label(id)
html_args += %{ id="#{id}"}
end
if level > 0 and level <= 6
hd = "h#{level}"
if invoker.plain_caption?
ls = ""
else
ls = invoker.level_as_string + " "
end
url = invoker.args["url"]
if url
%{/n<#{hd}#{html_args}>#{l}#{ls}#{elt} /n}
else
%{/n<#{hd}#{html_args}>#{l}#{ls}#{elt} /n}
end
else
l += format_label(invoker, :string, [id]) if id
"/n#{l}#{elt}"
end
end
使用办法:
** 《C# Primer 中文版》
#OPT: caption="C# Primer" id=csprimer url=http://jjhou.csdn.net/jjtbooks-csprimer.htm
4. 左侧 SideBar 中区分章与节,用不同的 class,在css中修改格式。修改办法:
class Deplate::Core
def tabbar_auto_entries(tabbar, idx, style, depth, inactivedepth, tags, tabsize)
if @variables["tabBarHomeName"]
s = idx == 0 ? "#{style}Active" : "#{style}Inactive"
title = @variables["tabBarHomeName"]
file = @formatter.navbar_guess_file_name(0, idx, :navbar)
tabbar << tabbar_entry(%{#{title}}, tags, s, tabsize)
end
each_heading(depth) do |hd, title|
lstr = hd.level_as_string
lnr = hd.top_heading_idx
file = hd.output_file_name(:basename => true)
if hd.level > 1
anchor = hd.args[:id] || hd.label.first
if anchor
file = [file, "#", anchor].join
end
end
if top_heading_by_idx(idx) == hd.top_heading
s = "#{style}" # Active
else
s = "#{style}" # Inactive
if hd.level > inactivedepth
next
end
end
if hd.level == 1
tabbar << tabbar_entry(%{#{title}}, tags, s, tabsize)
else
s = [s, "Sec"].join
tabbar << tabbar_entry(%{#{title}}, tags, s, tabsize)
end
end
end
...
5. 允许按节(section)分割文件。修改办法:
class Deplate::Core
# Set the current top heading.
# heading:: Heading object
# text:: The output filename base
def set_top_heading(heading, text)
if heading.level == 1 || heading.level == 2
fname = nil
下同
class Deplate::Element::Heading < Deplate::Element
def is_top_heading?
@level == 1 || @level == 2
end
...
6. 自动根据输入文件名设置输出文件名。修改办法:
class Deplate::Element::Heading < Deplate::Element
def register_heading
sc = @args['id'] || @args['shortcaption'] || File.basename(@deplate.current_source, ".*")
log(['Register heading', level_as_string, sc], :debug)
@deplate.set_top_heading(self, sc)
end
end
例如输入文件是 articles.txt,输出文件自动为 articles.html,要求每个章为一个文件:以下是 articles.txt 示例
* 文章
- 部分文章为 PDF 格式,需要 Acrobat Reader,这些文章通常更正式一些。
[[http://www.adobe.com/products/acrobat/readstep2.html][{img w=88 h=31:get_adobe_reader.png}]*]
*** 2006 年
** zlib 在 Visual Studio 2005 下编译失败的解决办法
#OPT: noList! url=zlib_vs2005.html
** 向 Word 和 PowerPoint 插入 LaTeX 公式的小工具
#OPT: id=eqLaTeX url=http://blog.csdn.net/Solstice/archive/2006/01/28/589643.aspx
- 通过拖拽方式向 Word 和 PowerPoint 插入 LaTeX 公式图片。(2006 年 1 月)