maruku 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/{maruku0.3 → marudown} +6 -14
- data/bin/maruku +1 -1
- data/bin/marutest +37 -9
- data/docs/TOFIX.html +22 -0
- data/docs/TOFIX.md +3 -0
- data/docs/changelog-0.2.13.html +30 -0
- data/docs/changelog-0.2.13.md +6 -0
- data/docs/changelog-0.3.html +19 -5
- data/docs/faq.html +51 -40
- data/docs/faq.md +3 -3
- data/docs/hidden_o_n_squared.md +10 -0
- data/docs/index.html +84 -396
- data/docs/markdown_syntax.html +139 -330
- data/docs/markdown_syntax.md +80 -93
- data/docs/maruku.html +84 -396
- data/docs/maruku.md +88 -158
- data/docs/proposal.html +13 -106
- data/docs/proposal.md +3 -3
- data/docs/todo.html +38 -28
- data/lib/maruku.rb +77 -11
- data/lib/maruku/attributes.rb +186 -0
- data/lib/maruku/defaults.rb +40 -0
- data/lib/maruku/errors_management.rb +55 -39
- data/lib/maruku/helpers.rb +156 -72
- data/lib/maruku/input/charsource.rb +319 -0
- data/lib/maruku/{html_helper.rb → input/html_helper.rb} +30 -9
- data/lib/maruku/input/linesource.rb +111 -0
- data/lib/maruku/input/parse_block.rb +562 -0
- data/lib/maruku/{parse_doc.rb → input/parse_doc.rb} +60 -28
- data/lib/maruku/{parse_span_better.rb → input/parse_span_better.rb} +226 -256
- data/lib/maruku/input/type_detection.rb +137 -0
- data/lib/maruku/maruku.rb +33 -0
- data/lib/maruku/{to_html.rb → output/to_html.rb} +151 -132
- data/lib/maruku/{to_latex.rb → output/to_latex.rb} +31 -35
- data/lib/maruku/{to_latex_entities.rb → output/to_latex_entities.rb} +25 -3
- data/lib/maruku/output/to_latex_strings.rb +64 -0
- data/lib/maruku/output/to_markdown.rb +164 -0
- data/lib/maruku/{to_s.rb → output/to_s.rb} +6 -0
- data/lib/maruku/string_utils.rb +12 -181
- data/lib/maruku/structures.rb +91 -67
- data/lib/maruku/structures_inspect.rb +78 -0
- data/lib/maruku/structures_iterators.rb +24 -2
- data/lib/maruku/tests/benchmark.rb +41 -9
- data/lib/maruku/tests/new_parser.rb +317 -286
- data/lib/maruku/tests/tests.rb +20 -0
- data/lib/maruku/toc.rb +64 -64
- data/lib/maruku/usage/example1.rb +33 -0
- data/lib/maruku/version.rb +8 -2
- data/tests/unittest/abbreviations.md +27 -16
- data/tests/unittest/attributes/attributes.md +89 -0
- data/tests/unittest/attributes/circular.md +51 -0
- data/tests/unittest/attributes/default.md +47 -0
- data/tests/unittest/blank.md +10 -6
- data/tests/unittest/blanks_in_code.md +26 -26
- data/tests/unittest/code.md +9 -9
- data/tests/unittest/code2.md +12 -13
- data/tests/unittest/code3.md +34 -34
- data/tests/unittest/easy.md +9 -7
- data/tests/unittest/email.md +9 -7
- data/tests/unittest/encoding/iso-8859-1.md +41 -4
- data/tests/unittest/encoding/utf-8.md +6 -5
- data/tests/unittest/entities.md +52 -80
- data/tests/unittest/escaping.md +47 -35
- data/tests/unittest/extra_dl.md +19 -29
- data/tests/unittest/extra_header_id.md +31 -24
- data/tests/unittest/extra_table1.md +14 -32
- data/tests/unittest/footnotes.md +58 -42
- data/tests/unittest/headers.md +11 -11
- data/tests/unittest/hrule.md +14 -24
- data/tests/unittest/images.md +41 -26
- data/tests/unittest/inline_html.md +104 -56
- data/tests/unittest/inline_html2.md +38 -0
- data/tests/unittest/links.md +74 -33
- data/tests/unittest/list1.md +18 -15
- data/tests/unittest/list2.md +31 -13
- data/tests/unittest/list3.md +29 -28
- data/tests/unittest/list4.md +103 -12
- data/tests/unittest/lists.md +86 -53
- data/tests/unittest/lists6.md +53 -0
- data/tests/unittest/lists7.md +31 -0
- data/tests/unittest/lists_after_paragraph.md +105 -71
- data/tests/unittest/lists_ol.md +149 -73
- data/tests/unittest/misc_sw.md +366 -326
- data/tests/unittest/notyet/escape.md +10 -10
- data/tests/unittest/notyet/header_after_par.md +20 -14
- data/tests/unittest/notyet/ticks.md +8 -35
- data/tests/unittest/notyet/triggering.md +72 -45
- data/tests/unittest/olist.md +78 -0
- data/tests/unittest/one.md +5 -3
- data/tests/unittest/paragraph.md +5 -3
- data/tests/unittest/paragraph_rules/dont_merge_ref.md +15 -9
- data/tests/unittest/paragraph_rules/tab_is_blank.md +9 -5
- data/tests/unittest/paragraphs.md +21 -26
- data/tests/unittest/recover/recover_links.md +6 -5
- data/tests/unittest/references/long_example.md +39 -30
- data/tests/unittest/references/spaces_and_numbers.md +2 -2
- data/tests/unittest/syntax_hl.md +33 -31
- data/tests/unittest/test.md +4 -6
- data/tests/unittest/wrapping.md +43 -26
- metadata +160 -139
- data/docs/markdown_extra2.html +0 -87
- data/docs/markdown_extra2.md +0 -83
- data/docs/markdown_syntax_2.html +0 -152
- data/lib/maruku/parse_block.rb +0 -564
- data/lib/maruku/parse_span.rb +0 -451
- data/lib/maruku/to_latex_strings.rb +0 -59
- data/lib/maruku/to_markdown.rb +0 -110
- data/lib/test.rb +0 -29
@@ -0,0 +1,137 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
3
|
+
#
|
4
|
+
# This file is part of Maruku.
|
5
|
+
#
|
6
|
+
# Maruku is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Maruku is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Maruku; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
#++
|
20
|
+
|
21
|
+
class String
|
22
|
+
include MaRuKu::Strings
|
23
|
+
def md_type()
|
24
|
+
@md_type ||= line_md_type(self)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class NilClass
|
29
|
+
def md_type() nil end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
# This code does the classification of lines for block-level parsing.
|
34
|
+
module MaRuKu; module Strings
|
35
|
+
|
36
|
+
def line_md_type(l)
|
37
|
+
# The order of evaluation is important (:text is a catch-all)
|
38
|
+
return :text if l =~ /^[a-zA-Z]/
|
39
|
+
return :code if number_of_leading_spaces(l)>=4
|
40
|
+
return :empty if l =~ /^\s*$/
|
41
|
+
return :footnote_text if l =~ FootnoteText
|
42
|
+
return :ref_definition if l =~ LinkRegex or l=~ IncompleteLink
|
43
|
+
return :abbreviation if l =~ Abbreviation
|
44
|
+
return :definition if l =~ Definition
|
45
|
+
# I had a bug with emails and urls at the beginning of the
|
46
|
+
# line that were mistaken for raw_html
|
47
|
+
return :text if l=~EMailAddress or l=~ URL
|
48
|
+
# raw html is like PHP Markdown Extra: at most three spaces before
|
49
|
+
return :raw_html if l =~ %r{^[ ]?[ ]?[ ]?</?\s*\w+}
|
50
|
+
return :raw_html if l =~ %r{[ ]{0,3}<\!\-\-}
|
51
|
+
return :ulist if l =~ /^\s?([\*\-\+])\s+.*\w+/
|
52
|
+
return :olist if l =~ /^\s?\d+\..*\w+/
|
53
|
+
return :header1 if l =~ /^(=)+/
|
54
|
+
return :header2 if l =~ /^([-\s])+$/
|
55
|
+
return :header3 if l =~ /^(#)+\s*\S+/
|
56
|
+
# at least three asterisks on a line, and only whitespace
|
57
|
+
return :hrule if l =~ /^(\s*\*\s*){3,1000}$/
|
58
|
+
return :hrule if l =~ /^(\s*-\s*){3,1000}$/ # or hyphens
|
59
|
+
return :hrule if l =~ /^(\s*_\s*){3,1000}$/ # or underscores
|
60
|
+
return :quote if l =~ /^>/
|
61
|
+
return :metadata if l =~ /^@/
|
62
|
+
# if @@new_meta_data?
|
63
|
+
return :ald if l =~ AttributeDefinitionList
|
64
|
+
return :ial if l =~ /^\s{0,3}\{.*\}/
|
65
|
+
# end
|
66
|
+
return :text # else, it's just text
|
67
|
+
end
|
68
|
+
|
69
|
+
# $1 = id $2 = attribute list
|
70
|
+
AttributeDefinitionList = /^\s{0,3}\{([\w\d\s]+)\}:\s*(.*)\s*$/
|
71
|
+
|
72
|
+
# Example:
|
73
|
+
# ^:blah blah
|
74
|
+
# ^: blah blah
|
75
|
+
# ^ : blah blah
|
76
|
+
Definition = %r{
|
77
|
+
^ # begin of line
|
78
|
+
[ ]{0,3} # up to 3 spaces
|
79
|
+
: # colon
|
80
|
+
\s* # whitespace
|
81
|
+
(\S.*) # the text = $1
|
82
|
+
$ # end of line
|
83
|
+
}x
|
84
|
+
|
85
|
+
# Example:
|
86
|
+
# *[HTML]: Hyper Text Markup Language
|
87
|
+
Abbreviation = %r{
|
88
|
+
^ # begin of line
|
89
|
+
\* # one asterisk
|
90
|
+
\[ # opening bracket
|
91
|
+
([^\]]+) # any non-closing bracket: id = $1
|
92
|
+
\] # closing bracket
|
93
|
+
: # colon
|
94
|
+
\s* # whitespace
|
95
|
+
(\S.*\S)* # definition=$2
|
96
|
+
\s* # strip this whitespace
|
97
|
+
$ # end of line
|
98
|
+
}x
|
99
|
+
|
100
|
+
FootnoteText = %r{
|
101
|
+
^\s*\[(\^.+)\]: # id = $1 (including '^')
|
102
|
+
\s*(\S.*)?$ # text = $2 (not obb.)
|
103
|
+
}x
|
104
|
+
|
105
|
+
# This regex is taken from BlueCloth sources
|
106
|
+
# Link defs are in the form: ^[id]: \n? url "optional title"
|
107
|
+
LinkRegex = %r{
|
108
|
+
^[ ]*\[([^\]]+)\]: # id = $1
|
109
|
+
[ ]*
|
110
|
+
<?(\S+)>? # url = $2
|
111
|
+
[ ]*
|
112
|
+
(?:# Titles are delimited by "quotes" or (parens).
|
113
|
+
["(']
|
114
|
+
(.+?) # title = $3
|
115
|
+
[")'] # Matching ) or "
|
116
|
+
\s*(.+)? # stuff = $4
|
117
|
+
)? # title is optional
|
118
|
+
}x
|
119
|
+
|
120
|
+
IncompleteLink = %r{^\s*\[(.+)\]:\s*$}
|
121
|
+
|
122
|
+
HeaderWithId = /^(.*)\{\#([\w_-]+)\}\s*$/
|
123
|
+
|
124
|
+
HeaderWithAttributes = /^(.*)\{(.*)\}\s*$/
|
125
|
+
|
126
|
+
|
127
|
+
# if contains a pipe, it could be a table header
|
128
|
+
MightBeTableHeader = %r{\|}
|
129
|
+
# -------------:
|
130
|
+
Sep = /\s*(\:)?\s*-+\s*(\:)?\s*/
|
131
|
+
# | -------------:| ------------------------------ |
|
132
|
+
TableSeparator = %r{^(\|?#{Sep}\|?)+\s*$}
|
133
|
+
|
134
|
+
|
135
|
+
EMailAddress = /<([^:]+@[^:]+)>/
|
136
|
+
URL = /^<http:/
|
137
|
+
end end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
3
|
+
#
|
4
|
+
# This file is part of Maruku.
|
5
|
+
#
|
6
|
+
# Maruku is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Maruku is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with Maruku; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
#++
|
20
|
+
|
21
|
+
|
22
|
+
# The Maruku class is the public interface
|
23
|
+
|
24
|
+
class Maruku
|
25
|
+
|
26
|
+
def initialize(s=nil, meta={})
|
27
|
+
super(nil)
|
28
|
+
self.attributes.merge! meta
|
29
|
+
if s
|
30
|
+
parse_doc(s)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#--
|
1
2
|
# Copyright (C) 2006 Andrea Censi <andrea (at) rubyforge.org>
|
2
3
|
#
|
3
4
|
# This file is part of Maruku.
|
@@ -15,6 +16,7 @@
|
|
15
16
|
# You should have received a copy of the GNU General Public License
|
16
17
|
# along with Maruku; if not, write to the Free Software
|
17
18
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
19
|
+
#++
|
18
20
|
|
19
21
|
|
20
22
|
require 'rexml/document'
|
@@ -24,9 +26,27 @@ require 'syntax'
|
|
24
26
|
require 'syntax/convertors/html'
|
25
27
|
|
26
28
|
|
27
|
-
class
|
28
|
-
|
29
|
+
class String
|
30
|
+
# A string is rendered into HTML by creating
|
31
|
+
# a REXML::Text node. REXML takes care of all the encoding.
|
32
|
+
def to_html
|
33
|
+
REXML::Text.new(self)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
class REXML::Element
|
39
|
+
# We only want to output the children in Maruku::to_html
|
40
|
+
public :write_children
|
41
|
+
end
|
42
|
+
|
43
|
+
|
29
44
|
|
45
|
+
# This module groups all functions related to HTML export.
|
46
|
+
module MaRuKu; module Out; module HTML
|
47
|
+
include REXML
|
48
|
+
include MaRuKu::Defaults
|
49
|
+
|
30
50
|
# Render as an HTML fragment (no head, just the content of BODY). (returns a string)
|
31
51
|
def to_html(context={})
|
32
52
|
indent = context[:indent] || -1
|
@@ -38,13 +58,13 @@ class Maruku
|
|
38
58
|
end
|
39
59
|
|
40
60
|
# render footnotes
|
41
|
-
if @doc.
|
61
|
+
if @doc.footnotes_order.size > 0
|
42
62
|
div << render_footnotes
|
43
63
|
end
|
44
64
|
|
45
65
|
doc = Document.new(nil,{:respect_whitespace =>:all})
|
46
66
|
doc << div
|
47
|
-
add_whitespace(doc)
|
67
|
+
#add_whitespace(doc)
|
48
68
|
|
49
69
|
# REXML Bug? if indent!=-1 whitespace is not respected for 'pre' elements
|
50
70
|
# containing code.
|
@@ -63,10 +83,7 @@ class Maruku
|
|
63
83
|
# REXML Bug? if indent!=-1 whitespace is not respected for 'pre' elements
|
64
84
|
# containing code.
|
65
85
|
doc.write(xml,indent,transitive=true,ie_hack);
|
66
|
-
|
67
|
-
# encoding = ( (enc=@meta[:encoding]) ?
|
68
|
-
# "encoding='#{enc}'" : "")
|
69
|
-
|
86
|
+
|
70
87
|
xhtml10strict = "<?xml version='1.0' encoding='utf-8'?>
|
71
88
|
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN'
|
72
89
|
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n"
|
@@ -81,20 +98,27 @@ class Maruku
|
|
81
98
|
root = Element.new('html', doc)
|
82
99
|
root.add_namespace('http://www.w3.org/1999/xhtml')
|
83
100
|
|
84
|
-
lang = @
|
101
|
+
lang = @attributes[:lang] || 'en'
|
85
102
|
root.attributes['lang'] = lang
|
86
103
|
root.attributes['xml:lang'] = lang
|
87
104
|
|
88
105
|
head = Element.new 'head', root
|
89
106
|
|
107
|
+
#<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
108
|
+
me = Element.new 'meta', head
|
109
|
+
me.attributes['http-equiv'] = 'Content-type'
|
110
|
+
me.attributes['content'] = 'text/html; charset=utf-8'
|
111
|
+
|
90
112
|
# Create title element
|
91
|
-
doc_title = @
|
92
|
-
title = Element.new 'title'
|
113
|
+
doc_title = @attributes[:title] || @attributes[:subject] || ""
|
114
|
+
title = Element.new 'title', head
|
93
115
|
title << Text.new(doc_title)
|
94
|
-
|
116
|
+
|
117
|
+
# Encoding
|
95
118
|
|
96
119
|
|
97
|
-
|
120
|
+
|
121
|
+
css = @attributes[:css]
|
98
122
|
if css
|
99
123
|
# <link type="text/css" rel="stylesheet" href="..." />
|
100
124
|
link = Element.new 'link'
|
@@ -111,7 +135,7 @@ class Maruku
|
|
111
135
|
end
|
112
136
|
|
113
137
|
# render footnotes
|
114
|
-
if @doc.
|
138
|
+
if @doc.footnotes_order.size > 0
|
115
139
|
body << render_footnotes
|
116
140
|
end
|
117
141
|
|
@@ -121,7 +145,7 @@ class Maruku
|
|
121
145
|
|
122
146
|
root << body
|
123
147
|
|
124
|
-
|
148
|
+
# add_whitespace(doc)
|
125
149
|
doc
|
126
150
|
end
|
127
151
|
|
@@ -182,17 +206,17 @@ class Maruku
|
|
182
206
|
div.attributes['class'] = 'footnotes'
|
183
207
|
div << Element.new('hr')
|
184
208
|
ol = Element.new 'ol'
|
185
|
-
@doc.
|
186
|
-
f =
|
209
|
+
@doc.footnotes_order.each_with_index do |fid, i| num = i+1
|
210
|
+
f = self.footnotes[fid]
|
187
211
|
if f
|
188
|
-
li =
|
212
|
+
li = f.wrap_as_element('li')
|
189
213
|
li.attributes['id'] = "fn:#{num}"
|
190
214
|
|
191
215
|
a = Element.new 'a'
|
192
216
|
a.attributes['href'] = "#fnref:#{num}"
|
193
217
|
a.attributes['rev'] = 'footnote'
|
194
218
|
a<< Text.new('↩', true, nil, true)
|
195
|
-
li.children.last
|
219
|
+
li.insert_after(li.children.last, a)
|
196
220
|
ol << li
|
197
221
|
else
|
198
222
|
maruku_error"Could not find footnote '#{fid}'"
|
@@ -201,17 +225,7 @@ class Maruku
|
|
201
225
|
div << ol
|
202
226
|
div
|
203
227
|
end
|
204
|
-
end
|
205
|
-
|
206
|
-
class String
|
207
|
-
# A string is rendered into HTML by creating
|
208
|
-
# a REXML::Text node. REXML takes care of all the encoding.
|
209
|
-
def to_html
|
210
|
-
REXML::Text.new(self)
|
211
|
-
end
|
212
|
-
end
|
213
228
|
|
214
|
-
class MDElement
|
215
229
|
|
216
230
|
def to_html_hrule; Element.new 'hr' end
|
217
231
|
def to_html_linebreak; Element.new 'br' end
|
@@ -222,43 +236,47 @@ class MDElement
|
|
222
236
|
def wrap_as_element(name)
|
223
237
|
m = create_html_element name
|
224
238
|
children_to_html.each do |e| m << e; end
|
239
|
+
|
240
|
+
# m << Comment.new( "{"+self.al.to_md+"}") if not self.al.empty?
|
241
|
+
# m << Comment.new( @attributes.inspect) if not @attributes.empty?
|
225
242
|
m
|
226
243
|
end
|
227
244
|
|
228
245
|
def create_html_element(name)
|
229
246
|
m = Element.new name
|
230
|
-
if
|
231
|
-
if
|
232
|
-
if
|
247
|
+
if (v=@attributes[:id] ) then m.attributes['id' ] = v.to_s end
|
248
|
+
if (v=@attributes[:style]) then m.attributes['style'] = v.to_s end
|
249
|
+
if (v=@attributes[:class]) then m.attributes['class'] = v.to_s end
|
233
250
|
m
|
234
251
|
end
|
235
252
|
|
236
|
-
def to_html_paragraph; wrap_as_element('p') end
|
237
253
|
|
238
254
|
def to_html_ul
|
239
|
-
if @
|
255
|
+
if @attributes[:toc]
|
240
256
|
# render toc
|
241
257
|
html_toc = @doc.toc.to_html
|
242
258
|
return html_toc
|
243
259
|
else
|
244
|
-
wrap_as_element('ul')
|
260
|
+
add_ws wrap_as_element('ul')
|
245
261
|
end
|
246
262
|
end
|
247
263
|
|
248
264
|
|
249
|
-
def
|
250
|
-
def
|
251
|
-
def
|
252
|
-
def
|
265
|
+
def to_html_paragraph; add_ws wrap_as_element('p') end
|
266
|
+
def to_html_ol; add_ws wrap_as_element('ol') end
|
267
|
+
def to_html_li; add_ws wrap_as_element('li') end
|
268
|
+
def to_html_li_span; add_ws wrap_as_element('li') end
|
269
|
+
def to_html_quote; add_ws wrap_as_element('blockquote') end
|
253
270
|
def to_html_strong; wrap_as_element('strong') end
|
254
271
|
def to_html_emphasis; wrap_as_element('em') end
|
255
272
|
|
256
273
|
# nil if not applicable, else string
|
257
274
|
def section_number
|
258
|
-
return nil if not @doc.
|
275
|
+
return nil if not @doc.attributes[:use_numbered_headers]
|
259
276
|
|
260
|
-
|
261
|
-
|
277
|
+
n = @attributes[:section_number]
|
278
|
+
if n && (not n.empty?)
|
279
|
+
n.join('.')+". "
|
262
280
|
else
|
263
281
|
nil
|
264
282
|
end
|
@@ -278,13 +296,13 @@ class MDElement
|
|
278
296
|
end
|
279
297
|
|
280
298
|
def to_html_header
|
281
|
-
element_name = "h#{
|
299
|
+
element_name = "h#{self.level}"
|
282
300
|
h = wrap_as_element element_name
|
283
301
|
|
284
302
|
if span = render_section_number
|
285
303
|
h.insert_before(h.children.first, span)
|
286
304
|
end
|
287
|
-
h
|
305
|
+
add_ws h
|
288
306
|
end
|
289
307
|
|
290
308
|
def source2html(source)
|
@@ -294,9 +312,9 @@ class MDElement
|
|
294
312
|
end
|
295
313
|
|
296
314
|
def to_html_code;
|
297
|
-
source = self.
|
315
|
+
source = self.raw_code
|
298
316
|
|
299
|
-
lang =
|
317
|
+
lang = @attributes[:lang] || @doc.attributes[:code_lang]
|
300
318
|
|
301
319
|
lang = 'xml' if lang=='html'
|
302
320
|
use_syntax = get_setting(:html_use_syntax)
|
@@ -322,9 +340,9 @@ class MDElement
|
|
322
340
|
pre
|
323
341
|
rescue Object => e
|
324
342
|
maruku_error"Error while using the syntax library for code:\n#{source.inspect}"+
|
325
|
-
"Lang is #{lang} object is: "+
|
326
|
-
|
327
|
-
"
|
343
|
+
"Lang is #{lang} object is: \n"+
|
344
|
+
self.inspect +
|
345
|
+
"\nException: #{e.class}: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
|
328
346
|
|
329
347
|
tell_user("Using normal PRE because the syntax library did not work.")
|
330
348
|
to_html_code_using_pre(source)
|
@@ -362,7 +380,7 @@ class MDElement
|
|
362
380
|
|
363
381
|
def to_html_inline_code;
|
364
382
|
pre = Element.new 'code'
|
365
|
-
source = self.
|
383
|
+
source = self.raw_code
|
366
384
|
pre << source2html(source)
|
367
385
|
|
368
386
|
color = get_setting(:code_background_color, DEFAULT_CODE_COLOR)
|
@@ -375,9 +393,8 @@ class MDElement
|
|
375
393
|
|
376
394
|
def to_html_immediate_link
|
377
395
|
a = Element.new 'a'
|
378
|
-
url =
|
379
|
-
text = url
|
380
|
-
text = text.gsub(/^mailto:/,'') # don't show mailto
|
396
|
+
url = self.url
|
397
|
+
text = url.gsub(/^mailto:/,'') # don't show mailto
|
381
398
|
a << Text.new(text)
|
382
399
|
a.attributes['href'] = url
|
383
400
|
a
|
@@ -385,38 +402,43 @@ class MDElement
|
|
385
402
|
|
386
403
|
def to_html_link
|
387
404
|
a = wrap_as_element 'a'
|
405
|
+
id = self.ref_id
|
406
|
+
# if empty, use text
|
407
|
+
if id.size == 0
|
408
|
+
id = children.to_s.downcase
|
409
|
+
end
|
388
410
|
|
389
|
-
if
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
ref = @doc.refs[id]
|
395
|
-
if not ref
|
396
|
-
maruku_error"Could not find ref_id = #{id.inspect} for #{self.inspect}"
|
397
|
-
tell_user "Not creating a link for ref_id = #{id.inspect}."
|
398
|
-
return wrap_as_element('span')
|
399
|
-
else
|
400
|
-
url = ref[:url]
|
401
|
-
title = ref[:title]
|
402
|
-
a.attributes['href'] = url
|
403
|
-
a.attributes['title'] = title if title
|
404
|
-
end
|
411
|
+
if ref = @doc.refs[id]
|
412
|
+
url = ref[:url]
|
413
|
+
title = ref[:title]
|
414
|
+
a.attributes['href']=url if url
|
415
|
+
a.attributes['title']=title if title
|
405
416
|
else
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
a.attributes['href'] = url
|
410
|
-
a.attributes['title'] = title if title
|
411
|
-
else
|
412
|
-
maruku_error"Could not find url in #{self.inspect}"
|
413
|
-
tell_user "Not creating a link for ref_id = #{id.inspect}."
|
414
|
-
return wrap_as_element('span')
|
415
|
-
end
|
417
|
+
maruku_error"Could not find ref_id = #{id.inspect} for #{self.inspect}"
|
418
|
+
tell_user "Not creating a link for ref_id = #{id.inspect}."
|
419
|
+
return wrap_as_element('span')
|
416
420
|
end
|
417
|
-
a
|
421
|
+
return a
|
422
|
+
end
|
423
|
+
|
424
|
+
def to_html_im_link
|
425
|
+
a = wrap_as_element 'a'
|
426
|
+
url = self.url
|
427
|
+
title = self.title
|
428
|
+
if url
|
429
|
+
a.attributes['href'] = url
|
430
|
+
a.attributes['title'] = title if title
|
431
|
+
else
|
432
|
+
maruku_error"Could not find url in #{self.inspect}"
|
433
|
+
tell_user "Not creating a link for ref_id = #{id.inspect}."
|
434
|
+
return wrap_as_element('span')
|
435
|
+
end
|
436
|
+
return a
|
418
437
|
end
|
419
438
|
|
439
|
+
def add_ws(e)
|
440
|
+
[Text.new("\n"), e, Text.new("\n")]
|
441
|
+
end
|
420
442
|
##### Email address
|
421
443
|
|
422
444
|
def obfuscate(s)
|
@@ -428,7 +450,7 @@ class MDElement
|
|
428
450
|
end
|
429
451
|
|
430
452
|
def to_html_email_address
|
431
|
-
email =
|
453
|
+
email = self.email
|
432
454
|
a = Element.new 'a'
|
433
455
|
#a.attributes['href'] = Text.new("mailto:"+obfuscate(email),false,nil,true)
|
434
456
|
#a.attributes.add Attribute.new('href',Text.new(
|
@@ -444,42 +466,43 @@ class MDElement
|
|
444
466
|
|
445
467
|
def to_html_image
|
446
468
|
a = Element.new 'img'
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
else
|
455
|
-
url = ref[:url]
|
456
|
-
a.attributes['src'] = url
|
457
|
-
# puts ref.inspect
|
458
|
-
[:title, :class, :style].each do |s|
|
459
|
-
if ref[s] then
|
460
|
-
a.attributes[s.to_s] = ref[s]
|
461
|
-
end
|
469
|
+
id = self.ref_id
|
470
|
+
if ref = @doc.refs[id]
|
471
|
+
url = ref[:url]
|
472
|
+
a.attributes['src'] = url
|
473
|
+
[:title, :class, :style].each do |s|
|
474
|
+
if ref[s] then
|
475
|
+
a.attributes[s.to_s] = ref[s]
|
462
476
|
end
|
463
477
|
end
|
464
478
|
else
|
465
|
-
|
466
|
-
|
467
|
-
if not url
|
468
|
-
maruku_error"Image with no ID or url: #{self.inspect}"
|
469
|
-
tell_user "Could not create image with ref_id = #{id.inspect};"+
|
479
|
+
maruku_error"Could not find id = #{id.inspect} for\n #{self.inspect}"
|
480
|
+
tell_user "Could not create image with ref_id = #{id.inspect};"+
|
470
481
|
+" Using SPAN element as replacement."
|
471
482
|
return wrap_as_element('span')
|
472
|
-
end
|
473
|
-
a.attributes['src'] = url
|
474
|
-
a.attributes['title'] = title if title
|
475
483
|
end
|
476
|
-
a
|
484
|
+
return a
|
485
|
+
end
|
486
|
+
|
487
|
+
def to_html_im_image
|
488
|
+
a = Element.new 'img'
|
489
|
+
url = self.url
|
490
|
+
title = self.title
|
491
|
+
if not url
|
492
|
+
maruku_error"Image with no url: #{self.inspect}"
|
493
|
+
tell_user "Could not create image with ref_id = #{id.inspect};"+
|
494
|
+
+" Using SPAN element as replacement."
|
495
|
+
return wrap_as_element('span')
|
496
|
+
end
|
497
|
+
a.attributes['src'] = url
|
498
|
+
a.attributes['title'] = title if title
|
499
|
+
return a
|
477
500
|
end
|
478
501
|
|
479
502
|
def to_html_raw_html
|
480
|
-
raw_html =
|
503
|
+
raw_html = self.raw_html
|
481
504
|
if rexml_doc = @parsed_html
|
482
|
-
root =
|
505
|
+
root = rexml_doc.root
|
483
506
|
if root.nil?
|
484
507
|
s = "Bug in REXML: root() of Document is nil: \n#{rexml_doc.inspect}\n"+
|
485
508
|
"Raw HTML:\n#{raw_html.inspect}"
|
@@ -490,10 +513,13 @@ class MDElement
|
|
490
513
|
return div
|
491
514
|
end
|
492
515
|
|
493
|
-
|
516
|
+
# copies the @children array (FIXME is it deep?)
|
517
|
+
elements = root.to_a
|
518
|
+
return elements
|
494
519
|
else # invalid
|
495
520
|
# Creates red box with offending HTML
|
496
|
-
tell_user
|
521
|
+
tell_user "Wrapping bad html in a PRE with class 'markdown-html-error'\n"+
|
522
|
+
add_tabs(raw_html,1,'|')
|
497
523
|
pre = Element.new('pre')
|
498
524
|
pre.attributes['style'] = 'border: solid 3px red; background-color: pink'
|
499
525
|
pre.attributes['class'] = 'markdown-html-error'
|
@@ -502,18 +528,18 @@ class MDElement
|
|
502
528
|
end
|
503
529
|
end
|
504
530
|
|
505
|
-
def
|
531
|
+
def to_html_abbr
|
506
532
|
abbr = Element.new 'abbr'
|
507
533
|
abbr << Text.new(children[0])
|
508
|
-
abbr.attributes['title'] = self.
|
534
|
+
abbr.attributes['title'] = self.title if self.title
|
509
535
|
abbr
|
510
536
|
end
|
511
537
|
|
512
538
|
def to_html_footnote_reference
|
513
|
-
id =
|
539
|
+
id = self.footnote_id
|
514
540
|
|
515
541
|
# save the order of used footnotes
|
516
|
-
order =
|
542
|
+
order = @doc.footnotes_order
|
517
543
|
|
518
544
|
# take next number
|
519
545
|
order << id
|
@@ -541,7 +567,7 @@ class MDElement
|
|
541
567
|
|
542
568
|
## Table ###
|
543
569
|
def to_html_table
|
544
|
-
align =
|
570
|
+
align = self.align
|
545
571
|
num_columns = align.size
|
546
572
|
|
547
573
|
head = @children.slice(0, num_columns)
|
@@ -577,18 +603,10 @@ class MDElement
|
|
577
603
|
def to_html_cell; wrap_as_element('td') end
|
578
604
|
|
579
605
|
def to_html_entity
|
580
|
-
entity_name =
|
606
|
+
entity_name = self.entity_name
|
581
607
|
Text.new('&%s;' % [entity_name])
|
582
608
|
end
|
583
|
-
end
|
584
609
|
|
585
|
-
# We only want to output the children in Maruku::to_html
|
586
|
-
class REXML::Element; public :write_children end
|
587
|
-
|
588
|
-
# Some utilities
|
589
|
-
class MDElement
|
590
|
-
include REXML
|
591
|
-
|
592
610
|
# Convert each child to html
|
593
611
|
def children_to_html
|
594
612
|
array_to_html(@children)
|
@@ -599,18 +617,19 @@ class MDElement
|
|
599
617
|
array.each do |c|
|
600
618
|
method = c.kind_of?(MDElement) ?
|
601
619
|
"to_html_#{c.node_type}" : "to_html"
|
602
|
-
|
620
|
+
|
603
621
|
if not c.respond_to?(method)
|
604
|
-
raise "Object does not answer to #{method}: #{c.class} #{c.inspect}"
|
622
|
+
#raise "Object does not answer to #{method}: #{c.class} #{c.inspect}"
|
623
|
+
next
|
605
624
|
end
|
606
|
-
|
625
|
+
|
607
626
|
h = c.send(method)
|
608
|
-
|
627
|
+
|
609
628
|
if h.nil?
|
610
629
|
raise "Nil html created by method #{method}:\n#{h.inspect}\n"+
|
611
630
|
" for object #{c.inspect[0,300]}"
|
612
631
|
end
|
613
|
-
|
632
|
+
|
614
633
|
if h.kind_of?Array
|
615
634
|
e = e + h #h.each do |hh| e << hh end
|
616
635
|
else
|
@@ -619,10 +638,10 @@ class MDElement
|
|
619
638
|
end
|
620
639
|
e
|
621
640
|
end
|
622
|
-
|
641
|
+
|
623
642
|
def to_html_ref_definition; [] end
|
624
643
|
def to_latex_ref_definition; [] end
|
625
|
-
|
626
|
-
end
|
627
|
-
|
628
644
|
|
645
|
+
end # HTML
|
646
|
+
end # out
|
647
|
+
end # MaRuKu
|