deplate(Viki) 全面定制

最近拿 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 %{<span class="marker"><em class="marker">#{m}</em></span>}
            # 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 + "&nbsp;"
            end
            url = invoker.args["url"]
            if url
                %{/n<#{hd}#{html_args}>#{l}#{ls}<a href="#{url}">#{elt}</a></#{hd}>/n}
            else
                %{/n<#{hd}#{html_args}>#{l}#{ls}#{elt}</#{hd}>/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(%{<a class="tabBarEntry" href="#{file}">#{title}</a>}, 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(%{<a href="#{file}">#{title}</a>}, tags, s, tabsize)
            else
                s = [s, "Sec"].join
                tabbar << tabbar_entry(%{<a href="#{file}">#{title}</a>}, 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 月)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值