Esempio n. 1
0
		public static LinkInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(2) == "[[")
			{
				var index = reader.IndexOf("]]", 2);
				if (index == -1)
					return null;

				reader.Skip(2);
				var data = reader.Read(index - 2);
				reader.Skip(2);

				index = data.IndexOf("|");
				if (index == -1)
					return new LinkInline(data, data, parseContent: false);

				var url = data.Substring(0, index);
				var content = data.Substring(index + 1, data.Length - index - 1);

				return new LinkInline(url, content);
			}
			else if (reader.IsNewWord && UrlRegex.IsMatch(reader.NextWord))
			{
				var url = reader.ReadWord();

				return new LinkInline(url, url, parseContent: false);
			}

			return null;
		}
		public static EmphasisInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(2) != "//" || HasLinkPrefix(reader))
				return null;

			int index = 0;
			while (true)
			{
				index = reader.IndexOf("//", index + 2);
				if (index == -1)
					break;

				if (!HasLinkPrefix(reader, index))
					break;
			}
			
			reader.Skip(2);
			string content;
			if (index != -1)
			{
				content = reader.Read(index - 2);
				reader.Skip(2);
			}
			else
			{
				content = reader.ReadToEnd();
			}

			return new EmphasisInline(content);
		}
Esempio n. 3
0
		public static TableBlock TryParse(CreoleReader reader)
		{
			if (reader.Peek(1) != "|")
				return null;

			bool isFirstLine = true;
			string[] headers = null;
			List<string[]> rows = new List<string[]>();
			while (!reader.EndOfMarkup)
			{
				var line = reader.PeekLine().TrimEnd();

				if (!line.StartsWith("|"))
					break;

				var split = line.Substring(1).Split(new char[] { '|' }, StringSplitOptions.None);
				if (string.IsNullOrEmpty(split.Last().Trim()))
					split = split.Take(split.Count() - 1).ToArray();

				if (isFirstLine && !split.Any(p => !p.StartsWith("=")))
					headers = split.Select(p => p.Substring(1)).ToArray();
				else
					rows.Add(split);

				reader.ReadLine();
				isFirstLine = false;
			}

			return new TableBlock(headers, rows.ToArray());
		}
		public static LineBreakInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(2) != "\\\\")
				return null;

			reader.Skip(2);
			return new LineBreakInline();
		}
Esempio n. 5
0
		public static ListBlock TryParse(CreoleReader reader)
		{
			if (reader.NextWord != "*" && reader.NextWord != "#")
				return null;

			var markup = reader.ReadLineUntil(l => (l.StartsWith("*") || l.StartsWith("#")) ? -1 : 0, trimLines: true);

			return new ListBlock(markup);
		}
Esempio n. 6
0
		public static NoWikiBlock TryParse(CreoleReader reader)
		{
			if (reader.Peek(3) != "{{{")
				return null;
			
			var content = reader.ReadLineUntil(l => l.StartsWith("}}}") ? 3 : -1);
			if (content != null)
				return new NoWikiBlock(content.Substring(3, content.Length - 6));

			return null;	
		}
		public static HorizontalLineBlock TryParse(CreoleReader reader)
		{
			var line = reader.PeekLine().Trim();

			if (!line.StartsWith("----"))
				return null;

			if (line.Any(c => c != '-'))
				return null;

			reader.SkipLine();
			return new HorizontalLineBlock();
		}
Esempio n. 8
0
		private void RenderList(CreoleParser parser, CreoleWriter writer, CreoleReader reader, int level)
		{
			var indent = "";
			for (int i = 1; i < level * 2 - 1; i++)
				indent += "    ";

			while (!reader.EndOfMarkup)
			{
				var type = reader.Peek(level);
				if (type.Any(c => c != type[0]))
					break;
				type = type[0].ToString();

				if (type == "*") writer.AppendRawLine("{0}<ul>", indent);
				else if (type == "#") writer.AppendRawLine("{0}<ol>", indent);
				else throw new InvalidOperationException("Invalid list type");

				while (!reader.EndOfMarkup)
				{
					var nextType = reader.Peek(level);
					if (nextType.Any(c => c != type[0]))
						break;

					reader.Skip(level);
					var line = reader.ReadLine();
					var indentEndLi = false;

					writer.AppendRaw("{0}    <li>", indent);
					writer.AppendRaw(parser.ParseInlines(line).Trim());
					if (!reader.EndOfMarkup)
					{
						var next = reader.Peek(level + 1);
						if (next.Length == level + 1 && (!next.Any(c => c != '*') || !next.Any(c => c != '#')))
						{
							writer.AppendRawLine("");
							RenderList(parser, writer, reader, level + 1);
							indentEndLi = true;
						}
					}
					if (indentEndLi)
						writer.AppendRawLine("{0}    </li>", indent);
					else
						writer.AppendRawLine("</li>");
				}

				if (type == "*") writer.AppendRawLine("{0}</ul>", indent);
				else if (type == "#") writer.AppendRawLine("{0}</ol>", indent);
				else throw new InvalidOperationException("Invalid list type");
			}
		}
Esempio n. 9
0
		public static NoWikiInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(3) != "{{{")
				return null;

			var index = reader.IndexOf("}}}", 2);
			if (index == -1)
				return null;

			reader.Skip(3);
			var content = reader.Read(index - 3);
			reader.Skip(3);

			return new NoWikiInline(content);
		}
Esempio n. 10
0
		public static IEnumerable<ParagraphBlock> Parse(string paragraphs)
		{
			var reader = new CreoleReader(paragraphs);

			while (!reader.EndOfMarkup)
			{
				var content = reader.ReadLineUntil(l => l.Trim().Length <= 0 ? l.Length : -1);

				if (content == null)
					content = reader.ReadToEnd();
				else
					reader.SkipLine();

				if (content.Trim().Length <= 0)
					continue;

				yield return new ParagraphBlock(content.Trim());
			}
		}
Esempio n. 11
0
		public static StrongInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(2) != "**")
				return null;

			var index = reader.IndexOf("**", 2);

			reader.Skip(2);
			string content;
			if (index != -1)
			{
				content = reader.Read(index - 2);
				reader.Skip(2);
			}
			else
			{
				content = reader.ReadToEnd();
			}		

			return new StrongInline(content);
		}
Esempio n. 12
0
		public static HeadingBlock TryParse(CreoleReader reader)
		{
			var line = reader.PeekLine().Trim();

			if (!line.StartsWith("="))
				return null;

			var level = 0;
			for (level = 1; level < 6; level++)
				if (line[level] != '=') break;

			var endIndex = 0;
			for (endIndex = line.Length - 1; endIndex >= line.Length - level; endIndex--)
				if (line[endIndex] != '=') break;

			reader.SkipLine();

			var content = line.Substring(level, endIndex - (level - 1));

			return new HeadingBlock(level, content);
		}
Esempio n. 13
0
		public static ImageInline TryParse(CreoleReader reader)
		{
			if (reader.Peek(2) != "{{")
				return null;

			var index = reader.IndexOf("}}", 2);
			if (index == -1)
				return null;

			reader.Skip(2);
			var content = reader.Read(index - 2);
			reader.Skip(2);

			index = content.IndexOf("|");
			if (index == -1)
				return new ImageInline(content, null);

			var url = content.Substring(0, index);
			var alt = content.Substring(index + 1, content.Length - index - 1);

			return new ImageInline(url, alt);
		}
Esempio n. 14
0
		private static bool HasLinkPrefix(CreoleReader reader, int relativeIndex = 0)
		{
			return reader.HasPrefix("http:", relativeIndex) || reader.HasPrefix("https:", relativeIndex) || reader.HasPrefix("ftp:", relativeIndex);
		}