X-Git-Url: http://nitlanguage.org diff --git a/lib/markdown/markdown.nit b/lib/markdown/markdown.nit index 8ac0b6e..b9e2f6a 100644 --- a/lib/markdown/markdown.nit +++ b/lib/markdown/markdown.nit @@ -41,33 +41,39 @@ class MarkdownProcessor # # In normal markdown the following: # - # This is a paragraph - # * and this is not a list + # ~~~md + # This is a paragraph + # * and this is not a list + # ~~~ # # Will produce: # - #
This is a paragraph - # * and this is not a list
+ # ~~~html + #This is a paragraph + # * and this is not a list
+ # ~~~ # - # When using extended mode this changes to: + # When using extended mode this changes to: # - #This is a paragraph
- #This is a paragraph
+ #import markdown
+ # ~~~html
+ # import markdown
#
- # print "Hello World!".md_to_html
- #
+ # print "Hello World!".md_to_html
+ #
+ # ~~~
#
# * Underscores (Emphasis)
#
# Underscores in the middle of a word like:
#
- # Con_cat_this
+ # ~~~md
+ # Con_cat_this
+ # ~~~
#
- # normally produces this:
+ # normally produces this:
#
- # Concatthis
+ # ~~~html + #Concatthis
+ # ~~~ # # With extended mode they don't result in emphasis. # - #Con_cat_this
+ # ~~~html + #Con_cat_this
+ # ~~~ # # * Strikethrough # # Like in [GFM](https://help.github.com/articles/github-flavored-markdown), # strikethrought span is marked with `~~`. # - # ~~Mistaken text.~~ + # ~~~md + # ~~Mistaken text.~~ + # ~~~ # # becomes # - #"
+ var meta = block.meta
+ if meta != null then
+ v.add ""
else
v.add ""
end
@@ -880,6 +937,11 @@ class MDLocation
var column_end: Int
redef fun to_s do return "{line_start},{column_start}--{line_end},{column_end}"
+
+ # Return a copy of `self`.
+ fun copy: MDLocation do
+ return new MDLocation(line_start, column_start, line_end, column_end)
+ end
end
# A block of markdown lines.
@@ -1108,10 +1170,32 @@ abstract class Block
fun emit_blocks(v: MarkdownEmitter) do
var block = self.block.first_block
while block != null do
+ v.push_loc(block.location)
block.kind.emit(v)
+ v.pop_loc
block = block.next
end
end
+
+ # The raw content of the block as a multi-line string.
+ fun raw_content: String do
+ var infence = self isa BlockFence
+ var text = new FlatBuffer
+ var line = self.block.first_line
+ while line != null do
+ if not line.is_empty then
+ var str = line.value
+ if not infence and str.has_prefix(" ") then
+ text.append str.substring(4, str.length - line.trailing)
+ else
+ text.append str
+ end
+ end
+ text.append "\n"
+ line = line.next
+ end
+ return text.write_to_string
+ end
end
# A block without any markdown specificities.
@@ -1152,6 +1236,9 @@ end
class BlockCode
super Block
+ # Any string found after fence token.
+ var meta: nullable Text
+
# Number of char to skip at the beginning of the line.
#
# Block code lines start at 4 spaces.
@@ -1178,9 +1265,6 @@ end
class BlockFence
super BlockCode
- # Any string found after fence token.
- var meta: nullable Text
-
# Fence code lines start at 0 spaces.
redef var line_start = 0
end
@@ -1189,7 +1273,15 @@ end
class BlockHeadline
super Block
- redef fun emit(v) do v.decorator.add_headline(v, self)
+ redef fun emit(v) do
+ var loc = block.location.copy
+ loc.column_start += start
+ v.push_loc(loc)
+ v.decorator.add_headline(v, self)
+ v.pop_loc
+ end
+
+ private var start = 0
# Depth of the headline used to determine the headline level.
var depth = 0
@@ -1218,6 +1310,7 @@ class BlockHeadline
line.leading = 0
line.trailing = 0
end
+ self.start = start
depth = level.min(6)
end
end
@@ -1773,7 +1866,7 @@ end
# A markdown list line.
# Mainly used to factorize code between ordered and unordered lists.
-class LineList
+abstract class LineList
super Line
redef fun process(v) do
@@ -1853,7 +1946,7 @@ abstract class Token
var char: Char
# Output that token using `MarkdownEmitter::decorator`.
- fun emit(v: MarkdownEmitter) do v.addc char
+ fun emit(v: MarkdownEmitter) do v.decorator.add_char(v, char)
end
# A token without a specific meaning.
@@ -2037,6 +2130,7 @@ abstract class TokenLinkOrImage
if pos == -1 then return -1
end
end
+ if pos < start then return -1
if md[pos] != ')' then return -1
else if md[pos] == '[' then
pos += 1
@@ -2475,24 +2569,6 @@ redef class Text
return null
end
- # Init a `MDLocation` instance at `pos` in `self`.
- private fun pos_to_loc(pos: Int): MDLocation do
- assert pos <= length
- var line = 1
- var col = 0
- var i = 0
- while i <= pos do
- col += 1
- var c = self[i]
- if c == '\n' then
- line +=1
- col = 0
- end
- i +=1
- end
- return new MDLocation(line, col, line, col)
- end
-
# Is `self` an unsafe HTML element?
private fun is_html_unsafe: Bool do return html_unsafe_tags.has(self.write_to_string)