Module: MaRuKu::Out::Markdown

Included in:
MDElement
Defined in:
lib/maruku.rb,
lib/maruku/output/to_markdown.rb

Overview

Functions for exporting to MarkDown.

Constant Summary collapse

DefaultLineLength =
40

Instance Method Summary collapse

Instance Method Details

#add_indent(s, char = " ") ⇒ Object



85
86
87
88
89
# File 'lib/maruku/output/to_markdown.rb', line 85

def add_indent(s,char="    ")
	t = s.split("\n").map{|x| char+x }.join("\n")
	s << ?\n if t[-1] == ?\n
	s
end

#array_to_md(array, context, join_char = '') ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/maruku/output/to_markdown.rb', line 127

def array_to_md(array, context, join_char='')
	e = []
	array.each do |c|
		method = c.kind_of?(MDElement) ? 
		   "to_md_#{c.node_type}" : "to_md"
		
		if not c.respond_to?(method)
			#raise "Object does not answer to #{method}: #{c.class} #{c.inspect[0,100]}"
#				tell_user "Using default for #{c.node_type}"
			method = 'to_md'
		end
		
#			puts "#{c.inspect} created with method #{method}"
		h =  c.send(method, context)
		
		if h.nil?
			raise "Nil md for #{c.inspect} created with method #{method}"
		end
		
		if h.kind_of?Array
			e = e + h
		else
			e << h
		end
	end
	e.join(join_char)
end

#children_to_md(context) ⇒ Object

Convert each child to html



92
93
94
# File 'lib/maruku/output/to_markdown.rb', line 92

def children_to_md(context)
	array_to_md(@children, context)
end

#to_md(context = {}) ⇒ Object



39
40
41
# File 'lib/maruku/output/to_markdown.rb', line 39

def to_md(context={})
	children_to_md(context)
end

#to_md_abbr_def(context) ⇒ Object



55
56
57
# File 'lib/maruku/output/to_markdown.rb', line 55

def to_md_abbr_def(context)
	"*[#{self.abbr}]: #{self.text}\n"
end

#to_md_li_span(context) ⇒ Object



48
49
50
51
52
53
# File 'lib/maruku/output/to_markdown.rb', line 48

def to_md_li_span(context)
	len = (context[:line_length] || DefaultLineLength) - 2
	s = add_tabs(wrap(@children, len-2, context), 1, '  ')
	s[0] = ?*
	s + "\n"
end

#to_md_ol(context) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/maruku/output/to_markdown.rb', line 59

def to_md_ol(context)
	len = (context[:line_length] || DefaultLineLength) - 2
	md = ""
	self.children.each_with_index do |li, i|
		s = add_tabs(w=wrap(li.children, len-2, context), 1, '    ')+"\n"
		s[0,4] = "#{i+1}.  "[0,4]
#			puts w.inspect
		md += s
	end
	md + "\n"
end

#to_md_paragraph(context) ⇒ Object



43
44
45
46
# File 'lib/maruku/output/to_markdown.rb', line 43

def to_md_paragraph(context)
	line_length = context[:line_length] || DefaultLineLength
	wrap(@children, line_length, context)+"\n"
end

#to_md_ul(context) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/maruku/output/to_markdown.rb', line 71

def to_md_ul(context)
	len = (context[:line_length] || DefaultLineLength) - 2
	md = ""
	self.children.each_with_index do |li, i|
		w = wrap(li.children, len-2, context)
#			puts "W: "+ w.inspect
		s = add_indent(w)
#			puts "S: " +s.inspect
		s[0,1] = "-"
		md += s
	end
	md + "\n"
end

#wrap(array, line_length, context) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/maruku/output/to_markdown.rb', line 96

def wrap(array, line_length, context)
	out = ""
	line = ""
	array.each do |c|
		if c.kind_of?(MDElement) &&  c.node_type == :linebreak
			out << line.strip << "  \n"; line="";
			next
		end
	
		pieces =
		if c.kind_of? String
			c.to_md.mysplit
		else
			[c.to_md(context)].flatten
		end
	
#			puts "Pieces: #{pieces.inspect}"
		pieces.each do |p|
			if p.size + line.size > line_length
				out << line.strip << "\n"; 
				line = ""
			end
			line << p
		end
	end
	out << line.strip << "\n" if line.size > 0
	out << ?\n if not out[-1] == ?\n
	out
end