/* * redcloth_inline.rl * * Copyright (C) 2008 Jason Garber */ %%{ machine redcloth_inline; # links mtext_noquotes = mtext -- '"' ; quoted_mtext = '"' mtext_noquotes '"' ; mtext_including_quotes = (mtext_noquotes ' "' mtext_noquotes '" ' mtext_noquotes?)+ ; link_says = ( C_noactions "."* " "* ((quoted_mtext | mtext_including_quotes | mtext_noquotes) -- '":') ) >A %{ STORE("link_text"); } ; link_says_noquotes_noactions = ( C_noquotes_noactions "."* " "* ((mtext_noquotes) -- '":') ) ; link = ( '"' link_says '":' %A uri %{ STORE_URL("href"); } ) >X ; link_noquotes_noactions = ( '"' link_says_noquotes_noactions '":' uri ) ; bracketed_link = ( '["' link_says '":' %A uri %{ STORE("href"); } :> "]" ) >X ; # images image_src = ( uri ) >A %{ STORE("src"); } ; image_is = ( A2 C ". "? image_src :> title? ) ; image_link = ( ":" uri >A %{ STORE_URL("href"); } ) ; image = ( "!" image_is "!" %A image_link? ) >X ; bracketed_image = ( "[!" image_is "!" %A image_link? "]" ) >X ; # footnotes footno = "[" >X %A digit+ %T "]" ; # markup end_markup_phrase = (" " | PUNCT | EOF | LF) @{ fhold; }; code = "["? "@" >X mtext >A %T :> "@" "]"? ; code_tag_start = "]* ">" ; code_tag_end = "" ; script_tag = ( "]* ">" (default+ -- "") "" LF? ) >X >A %T ; notextile = "" >X (default+ -- "") >A %T ""; strong = "["? "*" >X mtext >A %T :> "*" "]"? ; b = "["? "**" >X mtext >A %T :> "**" "]"? ; em = "["? "_" >X mtext >A %T :> "_" "]"? ; i = "["? "__" >X mtext >A %T :> "__" "]"? ; del = "[-" >X C ( mtext ) >A %T :>> "-]" ; emdash_parenthetical_phrase_with_spaces = " -- " mtext " -- " ; del_phrase = (( " " >A %{ STORE("beginning_space"); } "-") >X C ( mtext ) >A %T :>> ( "-" end_markup_phrase )) - emdash_parenthetical_phrase_with_spaces ; ins = "["? "+" >X mtext >A %T :> "+" "]"? ; sup = "[^" >X mtext >A %T :> "^]" ; sup_phrase = ( "^" when starts_phrase) >X ( mtext ) >A %T :>> ( "^" end_markup_phrase ) ; sub = "[~" >X mtext >A %T :> "~]" ; sub_phrase = ( "~" when starts_phrase) >X ( mtext ) >A %T :>> ( "~" end_markup_phrase ) ; span = "[%" >X mtext >A %T :> "%]" ; span_phrase = (("%" when starts_phrase) >X ( mtext ) >A %T :>> ( "%" end_markup_phrase )) ; cite = "["? "??" >X mtext >A %T :> "??" "]"? ; ignore = "["? "==" >X %A mtext %T :> "==" "]"? ; snip = "["? "```" >X %A mtext %T :> "```" "]"? ; # quotes quote1 = "'" >X %A mtext %T :> "'" ; non_quote_chars_or_link = (chars -- '"') | link_noquotes_noactions ; mtext_inside_quotes = ( non_quote_chars_or_link (mspace non_quote_chars_or_link)* ) ; html_tag_up_to_attribute_quote = "<" Name space+ NameAttr space* "=" space* ; quote2 = ('"' >X %A ( mtext_inside_quotes - (mtext_inside_quotes html_tag_up_to_attribute_quote ) ) %T :> '"' ) ; multi_paragraph_quote = (('"' when starts_line) >X %A ( chars -- '"' ) %T ); # html start_tag = ( "<" Name space+ AttrSet* (AttrEnd)? ">" | "<" Name ">" ) >X >A %T ; empty_tag = ( "<" Name space+ AttrSet* (AttrEnd)? "/>" | "<" Name "/>" ) >X >A %T ; end_tag = ( "" ) >X >A %T ; html_comment = ("") >X >A %T; # glyphs ellipsis = ( " "? >A %T "..." ) >X ; emdash = "--" ; arrow = "->" ; endash = " - " ; acronym = ( [A-Z] >A [A-Z0-9]{2,} %T "(" default+ >A %{ STORE("title"); } :> ")" ) >X ; caps_noactions = upper{3,} ; caps = ( caps_noactions >A %*T ) >X ; dim_digit = [0-9.]+ ; prime = ("'" | '"')?; dim_noactions = dim_digit prime (("x" | " x ") dim_digit prime) %T (("x" | " x ") dim_digit prime)? ; dim = dim_noactions >X >A %T ; tm = [Tt] [Mm] ; trademark = " "? ( "[" tm "]" | "(" tm ")" ) ; reg = [Rr] ; registered = " "? ( "[" reg "]" | "(" reg ")" ) ; cee = [Cc] ; copyright = ( "[" cee "]" | "(" cee ")" ) ; entity = ( "&" %A ( '#' digit+ | ( alpha ( alpha | digit )+ ) ) %T ';' ) >X ; # info redcloth_version = "[RedCloth::VERSION]" ; other_phrase = phrase -- dim_noactions; code_tag := |* code_tag_end { CAT(block); fgoto main; }; default => esc_pre; *|; main := |* image { INLINE(block, "image"); }; bracketed_image { INLINE(block, "image"); }; link { PARSE_LINK_ATTR("link_text"); PASS(block, "name", "link"); }; bracketed_link { PARSE_LINK_ATTR("link_text"); PASS(block, "name", "link"); }; code { PARSE_ATTR("text"); PASS_CODE(block, "text", "code", opts); }; code_tag_start { CAT(block); fgoto code_tag; }; notextile { INLINE(block, "notextile"); }; strong { PARSE_ATTR("text"); PASS(block, "text", "strong"); }; b { PARSE_ATTR("text"); PASS(block, "text", "b"); }; em { PARSE_ATTR("text"); PASS(block, "text", "em"); }; i { PARSE_ATTR("text"); PASS(block, "text", "i"); }; del { PASS(block, "text", "del"); }; del_phrase { PASS(block, "text", "del_phrase"); }; ins { PARSE_ATTR("text"); PASS(block, "text", "ins"); }; sup { PARSE_ATTR("text"); PASS(block, "text", "sup"); }; sup_phrase { PARSE_ATTR("text"); PASS(block, "text", "sup_phrase"); }; sub { PARSE_ATTR("text"); PASS(block, "text", "sub"); }; sub_phrase { PARSE_ATTR("text"); PASS(block, "text", "sub_phrase"); }; span { PARSE_ATTR("text"); PASS(block, "text", "span"); }; span_phrase { PARSE_ATTR("text"); PASS(block, "text", "span_phrase"); }; cite { PARSE_ATTR("text"); PASS(block, "text", "cite"); }; ignore => ignore; snip { PASS(block, "text", "snip"); }; quote1 { PASS(block, "text", "quote1"); }; quote2 { PASS(block, "text", "quote2"); }; multi_paragraph_quote { PASS(block, "text", "multi_paragraph_quote"); }; ellipsis { INLINE(block, "ellipsis"); }; emdash { INLINE(block, "emdash"); }; endash { INLINE(block, "endash"); }; arrow { INLINE(block, "arrow"); }; caps { INLINE(block, "caps"); }; acronym { INLINE(block, "acronym"); }; dim { INLINE(block, "dim"); }; trademark { INLINE(block, "trademark"); }; registered { INLINE(block, "registered"); }; copyright { INLINE(block, "copyright"); }; footno { PASS(block, "text", "footno"); }; entity { INLINE(block, "entity"); }; script_tag { INLINE(block, "inline_html"); }; start_tag { INLINE(block, "inline_html"); }; end_tag { INLINE(block, "inline_html"); }; empty_tag { INLINE(block, "inline_html"); }; html_comment { INLINE(block, "inline_html"); }; redcloth_version { INLINE(block, "inline_redcloth_version"); }; other_phrase => esc; PUNCT => esc; space => esc; EOF; *|; }%%;