lib/core/stream: LineIterator use CachedIterator
[nit.git] / lib / markdown2 / markdown_github.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Markdown Github mode
16 #
17 # Enables:
18 # * strike processing: ~strike~
19 # * super processing: ^super^
20 #
21 # TODO table
22 # TODO todo lists
23 module markdown_github
24
25 intrude import markdown_inline_parsing
26 intrude import markdown_block_parsing
27
28 redef class MdParser
29
30 # Enable Github mode
31 var github_mode = false is writable
32
33 redef var inline_parser is lazy do
34 var parser = super
35 parser.github_mode = github_mode
36 return parser
37 end
38 end
39
40 redef class MdInlineParser
41
42 # Enable Github mode
43 private var github_mode = false
44
45 redef var delimiter_processors is lazy do
46 var delimiters = super
47 if github_mode then
48 delimiters.add new MdStrikeProcessor
49 delimiters.add new MdSuperProcessor
50 end
51 return delimiters
52 end
53 end
54
55 # Strike processor
56 class MdStrikeProcessor
57 super MdEmphasisDelimiterProcessor
58 noautoinit
59
60 redef var delimiter_char = '~'
61 redef var min_length = 1
62 redef fun delimiter_use(opener, closer) do return opener.original_length
63
64 redef fun process(opener, closer, delimiter_use) do
65 var node = new MdStrike(
66 new MdLocation(
67 opener.location.line_start,
68 opener.location.column_start,
69 closer.location.line_end,
70 closer.location.column_end),
71 opening_delimiter.to_s * delimiter_use)
72 var tmp = opener.next
73 while tmp != null and tmp != closer do
74 var next = tmp.next
75 node.append_child(tmp)
76 tmp = next
77 end
78 opener.insert_after(node)
79 end
80 end
81
82 # Striked text
83 class MdStrike
84 super MdDelimited
85 end
86
87 # Super processor
88 class MdSuperProcessor
89 super MdEmphasisDelimiterProcessor
90 noautoinit
91
92 redef var delimiter_char = '^'
93 redef var min_length = 1
94 redef fun delimiter_use(opener, closer) do return opener.original_length
95
96 redef fun process(opener, closer, delimiter_use) do
97 var node = new MdSuper(
98 new MdLocation(
99 opener.location.line_start,
100 opener.location.column_start,
101 closer.location.line_end,
102 closer.location.column_end),
103 opening_delimiter.to_s * delimiter_use)
104 var tmp = opener.next
105 while tmp != null and tmp != closer do
106 var next = tmp.next
107 node.append_child(tmp)
108 tmp = next
109 end
110 opener.insert_after(node)
111 end
112 end
113
114 # Super text
115 class MdSuper
116 super MdDelimited
117 end