#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
require 'redcarpet'
module ImANerdRules
class CustomRender < Redcarpet::Render::HTML
def header(text, header_level)
text =~ /([\d+\.?]+)/
""
end
end
class Node
include Enumerable
@@glossary = {}
# @@line_num = 0
attr_reader :name, :parent, :content
def self.glossary
@@glossary
end
def initialize name, lvl, parent
@name = name
@lvl = lvl
@parent = parent
@children = nil
end
def add name
@children ||= []
@children << Node.new( name, @lvl + 1, self)
@children[-1]
end
def lvl o=nil, r=''
if not (o.nil? or @children.nil?)
r = (@children.index(o) + 1).to_s + '.'*(r.length > 0 ? 1 : 0) + r
end
return r if @parent.nil?
@parent.lvl(self, r) # tail recursive
end
def each &block
yield self
@children.each { |n| n.each &block } unless @children.nil?
end
def to_s r=''
r += "\n#{lvl}" + ' ' * (10-lvl.length) + ' ' + @name
return r if @children.nil?
@children.inject(r) { |r,c| c.to_s(r) }
end
def set_meta name, value
instance_variable_set("@#{name}", value)
if not self.class.method_defined? name.to_sym
self.class.define_method(name.to_sym) { instance_variable_get "@#{name}" }
end
end
def load dirname
out = false
meta = false
@content = ''
File.read(File.join(dirname, @name+'.md')).each_line { |l|
if l =~ /^---\s*/
meta = !meta
out = true if not meta
next
end
if meta
if l =~ /(\w+)\s*:\s*(.+)/
set_meta $1, $2
end
end
Node.glossary.each { |k,v|
r = /#{k}/
if l =~ r
# @@line_num += 1
# l.gsub! r, " [#{k}](#glos#{v[0]}) "
l.gsub! r, "[#{k}](#glos#{v[0]})"
r = v[-1]
if r.empty? or r[-1] != self
r << self
end
end
}
@content += l if out
}
# FIXME
# @content += "[toc](#ptoc)"
end
def href
"#hdr#{lvl}"
end
def title_md
"#{'#' * (@lvl+1)} #{lvl} #{title}"
end
def anchor
"