loader: build_module_importation invalidates the mmodule on errors
[nit.git] / lib / markdown / markdown.nit
index ad5e9a8..10dbcc6 100644 (file)
@@ -31,9 +31,9 @@ import template
 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:
        #
@@ -113,12 +113,12 @@ class MarkdownProcessor
        #   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.
-       fun process(input: String): Streamable do
+       fun process(input: String): Writable do
                # init processor
                link_refs.clear
                last_link_ref = null
@@ -537,7 +537,7 @@ class MarkdownEmitter
        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
@@ -555,9 +555,9 @@ end
 # 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
@@ -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
+               var is_valid = true
                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
-                       if tag.is_html_unsafe then
+                       if not tag.is_valid_html_tag then
+                               out.append "&lt;"
+                               pos = -1
+                       else if tag.is_html_unsafe then
+                               is_valid = false
                                out.append "&lt;"
                                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
-                       out.add '>'
+                       if is_valid then
+                               out.add '>'
+                       else
+                               out.append "&gt;"
+                       end
                        return pos
                end
                return -1
@@ -2378,6 +2387,14 @@ redef class Text
                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
@@ -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]
-                       print c
                        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"
-       fun md_to_html: Streamable do
+       fun md_to_html: Writable do
                var processor = new MarkdownProcessor
                return processor.process(self)
        end