Module: MaRuKu::Out::Markdown

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

Constant Summary collapse

DefaultLineLength =
40

Instance Method Summary collapse

Instance Method Details

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



121
122
123
124
125
# File 'lib/maruku/output/to_markdown.rb', line 121

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



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/maruku/output/to_markdown.rb', line 167

def array_to_md(array, context, join_char='')
  e = []
  array.each do |c|
    if c.is_a?(String)
      e << c
    else
      method = c.kind_of?(MaRuKu::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
  end
  e.join(join_char)
end

#children_to_md(context) ⇒ Object

Convert each child to html



128
129
130
# File 'lib/maruku/output/to_markdown.rb', line 128

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

#mysplit(c) ⇒ Object

“ andrea censi ” => [“ andrea ”, “censi ”]



10
11
12
13
14
15
16
# File 'lib/maruku/output/to_markdown.rb', line 10

def mysplit(c)
  res = c.split.map {|x| x + " " }
  if c[0] == ' ' && res[0]
    res[0] = " " + res[0]
  end
  res
end

#to_md(context = {}) ⇒ Object



5
6
7
# File 'lib/maruku/output/to_markdown.rb', line 5

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

#to_md_abbr_def(context) ⇒ Object



89
90
91
# File 'lib/maruku/output/to_markdown.rb', line 89

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

#to_md_code(context) ⇒ Object



27
28
29
# File 'lib/maruku/output/to_markdown.rb', line 27

def to_md_code(context)
  @raw_code.split("\n").collect { |line| "     " + line}.join("\n") + "\n\n"
end

#to_md_email_address(context) ⇒ Object



52
53
54
# File 'lib/maruku/output/to_markdown.rb', line 52

def to_md_email_address(context)
  "<#{@email}>"
end

#to_md_emphasis(context) ⇒ Object



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

def to_md_emphasis(context)
  "*#{children_to_md(context)}*"
end

#to_md_entity(context) ⇒ Object



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

def to_md_entity(context)
  "&#{@entity_name};"
end

#to_md_header(context) ⇒ Object



18
19
20
21
# File 'lib/maruku/output/to_markdown.rb', line 18

def to_md_header(context)
  pounds = "#" * @level
  "#{pounds} #{children_to_md(context)} #{pounds}\n\n"
end

#to_md_hrule(context) ⇒ Object



36
37
38
# File 'lib/maruku/output/to_markdown.rb', line 36

def to_md_hrule(context)
  "* * *\n"
end

#to_md_im_image(context) ⇒ Object



77
78
79
# File 'lib/maruku/output/to_markdown.rb', line 77

def to_md_im_image(context)
  "![#{children_to_md(context)}](#{@url}#{" \"#{@title}\"" if @title})"
end


69
70
71
# File 'lib/maruku/output/to_markdown.rb', line 69

def to_md_im_link(context)
  "[#{children_to_md(context)}](#{@url}#{" \"#{@title}\"" if @title})"
end

#to_md_image(context) ⇒ Object



81
82
83
# File 'lib/maruku/output/to_markdown.rb', line 81

def to_md_image(context)
  "![#{children_to_md(context)}][#{@ref_id}]"
end


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

def to_md_immediate_link(context)
  "<#{@url}>"
end

#to_md_inline_code(context) ⇒ Object



23
24
25
# File 'lib/maruku/output/to_markdown.rb', line 23

def to_md_inline_code(context)
  "`#{@raw_code}`"
end

#to_md_linebreak(context) ⇒ Object



60
61
62
# File 'lib/maruku/output/to_markdown.rb', line 60

def to_md_linebreak(context)
  "\n"
end


73
74
75
# File 'lib/maruku/output/to_markdown.rb', line 73

def to_md_link(context)
  "[#{children_to_md(context)}][#{@ref_id}]"
end

#to_md_ol(context) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/maruku/output/to_markdown.rb', line 93

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

#to_md_paragraph(context) ⇒ Object



64
65
66
67
# File 'lib/maruku/output/to_markdown.rb', line 64

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

#to_md_quote(context) ⇒ Object



31
32
33
34
# File 'lib/maruku/output/to_markdown.rb', line 31

def to_md_quote(context)
  line_length = (context[:line_length] || DefaultLineLength) - 2
  wrap(@children, line_length, context).split(/\n/).collect { |line| "> " + line}.join("\n") + "\n"
end

#to_md_ref_definition(context) ⇒ Object



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

def to_md_ref_definition(context)
  "[#{@ref_id}] #{@url}#{" \"#{@title}\"" if @title}"
end

#to_md_strong(context) ⇒ Object



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

def to_md_strong(context)
  "**#{children_to_md(context)}**"
end

#to_md_ul(context) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/maruku/output/to_markdown.rb', line 106

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)
    s = "- " + w
    #     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



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/maruku/output/to_markdown.rb', line 132

def wrap(array, line_length, context)
  out = ""
  line = ""
  array.each do |c|
    if c.kind_of?(MaRuKu::MDElement) &&  c.node_type == :linebreak
      out << line.strip << "  \n"; line="";
      next
    end

    pieces =
      if c.kind_of? String
        mysplit(c)
      elsif c.kind_of?(MaRuKu::MDElement)
        method = "to_md_#{c.node_type}"
        method = "to_md" unless c.respond_to?(method)
        [c.send(method, context)].flatten
      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