<?xml version="1.0"?>
<!DOCTYPE MODE SYSTEM "xmode.dtd">
<!--
	Markdown mode for jEdit by Ali Rantakari (http://hasseg.org)
	Last edited: April 23, 2009.
	
	- Markdown home: http://daringfireball.net/projects/markdown/
-->
<MODE>
	<RULES IGNORE_CASE="FALSE">
		
		
		<!-- literal characters (i.e. cases where they won't
		     specify formatting)
		-->
		<SEQ TYPE="NULL"> * </SEQ>
		<SEQ TYPE="NULL"> _ </SEQ>
		<SEQ TYPE="NULL">\][</SEQ>
		<SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[*_\\`\[\]\(\)\{\}#+-.!]</SEQ_REGEXP>
		
		<!-- inline code: `NSString* str = @"hi!";` -->
		<SPAN_REGEXP TYPE="LITERAL1" HASH_CHARS="`">
			<BEGIN>(`{1,2})</BEGIN>
			<END>$1</END>
		</SPAN_REGEXP>
		
		
		<!-- PROBLEM: code blocks
		     
		     Both code blocks and list paragraphs are specified by indenting
			 (4+ spaces or 1+ tab) - how to differentiate between them? We
			 don't want markdown syntax coloring to apply within code blocks
			 but we _do_ want it to apply within list paragraphs. As it stands,
			 we can't have both (or at least I don't know how to do that with
			 jEdit's current mode syntax implementation.)
		     
			 The next line applies one syntax color type for all lines that
			 begin with at least 4 spaces or 1 tab, which means that all such
			 lines are treated as code blocks (this disables markdown syntax
			 coloring for indented list paragraphs). Comment or uncomment it
			 according to your preferences.
		-->
		<EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" &#09;">(\s{4,}|\t+)</EOL_SPAN_REGEXP>
		<!-- The next line applies one syntax color type for all lines that
			 are indented "twice" (i.e. begin with at least 8 spaces or 2 tabs).
			 This should safely match only code blocks (no list paragraphs can
			 be indented twice like this, if I understand the spec correctly.)
		-->
		<EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" &#09;">(\s{4,}|\t+){2,}</EOL_SPAN_REGEXP>
		
		
		<!-- headers (setext-style:)      header text
		                                  ==============
		-->
		<!-- TODO: accept header text on previous line (how to match this? the
		           regexp matchers can't cross line breaks)
		-->
		<EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHAR="=">[=-]+</EOL_SPAN_REGEXP>
		<!-- headers (atx-style:)         ## header text
		-->
		<EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHAR="#">#{1,6}[^#]</EOL_SPAN_REGEXP>
		
		
		<!-- horizontal rules -->
		<EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="-*_" AT_LINE_START="TRUE">(\s*[-_*]+\s*){3,}[-*_\s]*$</EOL_SPAN_REGEXP>
		
		
		<!-- lists (unordered) -->
		<SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="*+- &#09;">\s{0,3}[*+-]\s+</SEQ_REGEXP>
		<!-- lists (ordered) -->
		<SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="0123456789 &#09;">\s{0,3}\d+\.\s+</SEQ_REGEXP>
		
		
		<!-- link or image reference definition -->
		<!-- TODO: accept link's title attribute on the next line (how to match
		           this? the regexp matchers can't cross line breaks)
		-->
		<EOL_SPAN_REGEXP TYPE="KEYWORD4" HASH_CHARS=" [" AT_LINE_START="TRUE">\s{0,3}\[.*?\]:\s+</EOL_SPAN_REGEXP>
		<!-- links or images (inline or reference) -->
		<SEQ_REGEXP TYPE="KEYWORD3" HASH_CHARS="![">!?\[</SEQ_REGEXP>
		<SEQ_REGEXP TYPE="KEYWORD3" HASH_CHARS="]">\]\s*[\(\[].*?[\)\]]</SEQ_REGEXP>
		
		
		
		<!-- emphasis (strong) -->
		<SPAN_REGEXP TYPE="MARKUP" HASH_CHARS="*_">
			<BEGIN>(\*\*|__)</BEGIN>
			<END>$1</END>
		</SPAN_REGEXP>
		<!-- emphasis (em) -->
		<SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_">
			<BEGIN>(\*|_)</BEGIN>
			<END>$1</END>
		</SPAN_REGEXP>
		
		
		<!-- blockquote start character -->
		<SEQ TYPE="LITERAL2" HASH_CHARS="&gt;" AT_LINE_START="TRUE">&gt;</SEQ>
		
		
		<!-- use html rules for the rest -->
		<IMPORT DELEGATE="html::MAIN" />
		
	</RULES>
</MODE>

