nitlanguage
/
nit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
loader: build_module_importation invalidates the mmodule on errors
[nit.git]
/
lib
/
markdown
/
markdown.nit
diff --git
a/lib/markdown/markdown.nit
b/lib/markdown/markdown.nit
index
ad5e9a8
..
10dbcc6
100644
(file)
--- a/
lib/markdown/markdown.nit
+++ b/
lib/markdown/markdown.nit
@@
-31,9
+31,9
@@
import template
class MarkdownProcessor
# `MarkdownEmitter` used for ouput.
class MarkdownProcessor
# `MarkdownEmitter` used for ouput.
- var emitter: MarkdownEmitter is noinit
+ var emitter: MarkdownEmitter is noinit, protected writable
- # Work in extended mode.
+ # Work in extended mode (default).
#
# Behavior changes when using extended mode:
#
#
# Behavior changes when using extended mode:
#
@@
-113,12
+113,12
@@
class MarkdownProcessor
# becomes
#
# <del>Mistaken text.</del>
# becomes
#
# <del>Mistaken text.</del>
- var ext_mode = false
+ var ext_mode = true
init do self.emitter = new MarkdownEmitter(self)
# Process the mardown `input` string and return the processed output.
init do self.emitter = new MarkdownEmitter(self)
# Process the mardown `input` string and return the processed output.
- fun process(input: String): Streamable do
+ fun process(input: String): Writable do
# init processor
link_refs.clear
last_link_ref = null
# init processor
link_refs.clear
last_link_ref = null
@@
-537,7
+537,7
@@
class MarkdownEmitter
end
# Append `e` to current buffer.
end
# Append `e` to current buffer.
- fun add(e: Streamable) do
+ fun add(e: Writable) do
if e isa Text then
current_buffer.append e
else
if e isa Text then
current_buffer.append e
else
@@
-555,9
+555,9
@@
end
# A Link Reference.
# Links that are specified somewhere in the mardown document to be reused as shortcuts.
#
# A Link Reference.
# Links that are specified somewhere in the mardown document to be reused as shortcuts.
#
-# Example:
-#
-# [1]: http://example.com/ "Optional title"
+# ~~~raw
+# [1]: http://example.com/ "Optional title"
+# ~~~
class LinkRef
# Link href
class LinkRef
# Link href
@@
-2266,6
+2266,7
@@
redef class Text
# Safe mode can be activated to limit reading to valid xml.
private fun read_xml(out: FlatBuffer, start: Int, safe_mode: Bool): Int do
var pos = 0
# Safe mode can be activated to limit reading to valid xml.
private fun read_xml(out: FlatBuffer, start: Int, safe_mode: Bool): Int do
var pos = 0
+ var is_valid = true
var is_close_tag = false
if start + 1 >= length then return -1
if self[start + 1] == '/' then
var is_close_tag = false
if start + 1 >= length then return -1
if self[start + 1] == '/' then
@@
-2283,7
+2284,11
@@
redef class Text
pos = read_xml_until(tmp, pos, ' ', '/', '>')
if pos == -1 then return -1
var tag = tmp.write_to_string.trim.to_lower
pos = read_xml_until(tmp, pos, ' ', '/', '>')
if pos == -1 then return -1
var tag = tmp.write_to_string.trim.to_lower
- if tag.is_html_unsafe then
+ if not tag.is_valid_html_tag then
+ out.append "<"
+ pos = -1
+ else if tag.is_html_unsafe then
+ is_valid = false
out.append "<"
if is_close_tag then out.add '/'
out.append tmp
out.append "<"
if is_close_tag then out.add '/'
out.append tmp
@@
-2306,7
+2311,11
@@
redef class Text
if pos == -1 then return -1
end
if self[pos] == '>' then
if pos == -1 then return -1
end
if self[pos] == '>' then
- out.add '>'
+ if is_valid then
+ out.add '>'
+ else
+ out.append ">"
+ end
return pos
end
return -1
return pos
end
return -1
@@
-2378,6
+2387,14
@@
redef class Text
return tpl.write_to_string.to_lower
end
return tpl.write_to_string.to_lower
end
+ private fun is_valid_html_tag: Bool do
+ if is_empty then return false
+ for c in self do
+ if not c.is_alpha then return false
+ end
+ return true
+ end
+
# Read and escape the markdown contained in `self`.
private fun escape(out: FlatBuffer, c: Char, pos: Int): Int do
if c == '\\' or c == '[' or c == ']' or c == '(' or c == ')' or c == '{' or
# Read and escape the markdown contained in `self`.
private fun escape(out: FlatBuffer, c: Char, pos: Int): Int do
if c == '\\' or c == '[' or c == ']' or c == '(' or c == ')' or c == '{' or
@@
-2395,7
+2412,6
@@
redef class Text
private fun meta_from_fence: nullable Text do
for i in [0..chars.length[ do
var c = chars[i]
private fun meta_from_fence: nullable Text do
for i in [0..chars.length[ do
var c = chars[i]
- print c
if c != ' ' and c != '`' and c != '~' then
return substring_from(i).trim
end
if c != ' ' and c != '`' and c != '~' then
return substring_from(i).trim
end
@@
-2426,7
+2442,7
@@
redef class String
# var md = "**Hello World!**"
# var html = md.md_to_html
# assert html == "<p><strong>Hello World!</strong></p>\n"
# var md = "**Hello World!**"
# var html = md.md_to_html
# assert html == "<p><strong>Hello World!</strong></p>\n"
- fun md_to_html: Streamable do
+ fun md_to_html: Writable do
var processor = new MarkdownProcessor
return processor.process(self)
end
var processor = new MarkdownProcessor
return processor.process(self)
end