Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > 7a036e8af259cd957ff83cd3d8293b72 > files > 17

ocaml-textile-devel-0.10-2.mga4.x86_64.rpm

<html><head>
<link rel="stylesheet" href="style.css" type="text/css">
<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
<link rel="Start" href="index.html">
<link title="Index of types" rel=Appendix href="index_types.html">
<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
<link title="Index of values" rel=Appendix href="index_values.html">
<link title="Index of modules" rel=Appendix href="index_modules.html">
<link title="Textile" rel="Chapter" href="Textile.html">
<link title="Textile_parser" rel="Chapter" href="Textile_parser.html">
<link title="Textile_html" rel="Chapter" href="Textile_html.html"><title>Textile_parser</title>
</head>
<body>
<code class="code"><span class="comment">(*&nbsp;This&nbsp;file&nbsp;is&nbsp;part&nbsp;of&nbsp;textile-ocaml.<br>
&nbsp;*<br>
&nbsp;*&nbsp;textile-ocaml&nbsp;is&nbsp;free&nbsp;software:&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or&nbsp;modify<br>
&nbsp;*&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;as&nbsp;published&nbsp;by<br>
&nbsp;*&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation,&nbsp;either&nbsp;version&nbsp;3&nbsp;of&nbsp;the&nbsp;License,&nbsp;or<br>
&nbsp;*&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.<br>
&nbsp;*<br>
&nbsp;*&nbsp;textile-ocaml&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,<br>
&nbsp;*&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of<br>
&nbsp;*&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;&nbsp;See&nbsp;the<br>
&nbsp;*&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.<br>
&nbsp;*<br>
&nbsp;*&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License<br>
&nbsp;*&nbsp;along&nbsp;with&nbsp;textile-ocaml.&nbsp;&nbsp;If&nbsp;not,&nbsp;see&nbsp;&lt;http://www.gnu.org/licenses/&gt;.<br>
&nbsp;*<br>
&nbsp;*&nbsp;Copyright&nbsp;2011&nbsp;Alexander&nbsp;Markov&nbsp;*)</span><br>
<br>
<span class="keyword">open</span>&nbsp;<span class="constructor">ExtString</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Textile</span><br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Textile_parsercomb</span><br>
<br>
<span class="keyword">let</span>&nbsp;(&gt;&gt;)&nbsp;f&nbsp;g&nbsp;=&nbsp;g&nbsp;f<br>
<span class="keyword">let</span>&nbsp;($)&nbsp;a&nbsp;b&nbsp;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;a&nbsp;(b&nbsp;x)<br>
<br>
<br>
<span class="comment">(*&nbsp;some&nbsp;defaults&nbsp;*)</span><br>
<br>
<span class="keyword">let</span>&nbsp;default_options&nbsp;=&nbsp;([],&nbsp;<span class="constructor">None</span>,&nbsp;(0,&nbsp;0))<br>
<span class="keyword">let</span>&nbsp;default_tableoptions&nbsp;=&nbsp;(default_options,&nbsp;<span class="constructor">None</span>)<br>
<span class="keyword">let</span>&nbsp;default_celloptions&nbsp;=&nbsp;(<span class="constructor">Data</span>,&nbsp;default_tableoptions,&nbsp;(<span class="constructor">None</span>,&nbsp;<span class="constructor">None</span>))<br>
<span class="keyword">let</span>&nbsp;empty_line&nbsp;=&nbsp;[]<br>
<br>
<br>
<span class="comment">(*&nbsp;various&nbsp;helpers&nbsp;*)</span><br>
<br>
<span class="keyword">let</span>&nbsp;num_of_char&nbsp;c&nbsp;=&nbsp;(int_of_char&nbsp;c)&nbsp;-&nbsp;48<br>
<br>
<span class="comment">(*&nbsp;junks&nbsp;n&nbsp;elements&nbsp;of&nbsp;the&nbsp;stream&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;njunk&nbsp;stream&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;n&nbsp;&gt;&nbsp;0<br>
&nbsp;&nbsp;<span class="keyword">then</span>&nbsp;<span class="keyword">begin</span>&nbsp;<span class="constructor">Stream</span>.junk&nbsp;stream;&nbsp;njunk&nbsp;stream&nbsp;(n-1)&nbsp;<span class="keyword">end</span><br>
<br>
<span class="comment">(*&nbsp;returns&nbsp;n'th&nbsp;element&nbsp;of&nbsp;the&nbsp;stream&nbsp;(from&nbsp;zero)&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;peekn&nbsp;stream&nbsp;n&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;l&nbsp;=&nbsp;<span class="constructor">Stream</span>.npeek&nbsp;(n+1)&nbsp;stream&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="keyword">try</span>&nbsp;<span class="constructor">Some</span>&nbsp;(<span class="constructor">List</span>.nth&nbsp;l&nbsp;n)<br>
&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">Failure</span>&nbsp;_&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">ExtList</span>.<span class="constructor">List</span>.<span class="constructor">Invalid_index</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="comment">(*&nbsp;ExtLib,&nbsp;goddamn&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">None</span><br>
<br>
<br>
<span class="comment">(*&nbsp;let's&nbsp;parse&nbsp;*)</span><br>
<br>
<span class="keyword">let</span>&nbsp;p_string_not_empty&nbsp;=&nbsp;<span class="keyword">function</span>&nbsp;<span class="string">""</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;fail&nbsp;<span class="keywordsign">|</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;s<br>
<span class="keyword">let</span>&nbsp;whitespace&nbsp;=&nbsp;<span class="keyword">function</span>&nbsp;<span class="string">'&nbsp;'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'\t'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">false</span><br>
<span class="keyword">let</span>&nbsp;punct&nbsp;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'!'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'"'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'$'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'%'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'&amp;'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'\''</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'('</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">')'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'*'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'+'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">','</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'-'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'.'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">':'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">';'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'&lt;'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'='</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'&gt;'</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'?'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">false</span><br>
&nbsp;&nbsp;<span class="comment">(*(c&nbsp;&gt;=&nbsp;'!'&nbsp;&amp;&amp;&nbsp;c&nbsp;&lt;&nbsp;'#')&nbsp;||&nbsp;(c&nbsp;&gt;&nbsp;'#'&nbsp;&amp;&amp;&nbsp;c&nbsp;&lt;=&nbsp;'.')&nbsp;||&nbsp;(c&nbsp;&gt;=&nbsp;':'&nbsp;&amp;&amp;&nbsp;c&nbsp;&lt;=&nbsp;'?')*)</span><br>
<span class="keyword">let</span>&nbsp;p_whitespace&nbsp;=&nbsp;p_pred&nbsp;whitespace<br>
<span class="keyword">let</span>&nbsp;p_not_whitespace&nbsp;=&nbsp;p_pred&nbsp;(<span class="keyword">fun</span>&nbsp;c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;not&nbsp;(whitespace&nbsp;c))<br>
<span class="keyword">let</span>&nbsp;p_punct&nbsp;=&nbsp;p_pred&nbsp;punct<br>
<br>
<span class="comment">(*&nbsp;checks&nbsp;previous&nbsp;char;&nbsp;doesn't&nbsp;jump&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;check_prev&nbsp;p&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;prev_pos&nbsp;=&nbsp;pos&nbsp;-&nbsp;1&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;(p&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">fun</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(r,&nbsp;(s,&nbsp;pos)))&nbsp;(s,&nbsp;prev_pos)<br>
<br>
<span class="comment">(*&nbsp;checks&nbsp;current&nbsp;char;&nbsp;doesn't&nbsp;jump&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;check_current&nbsp;p&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;(p&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">fun</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(r,&nbsp;(s,&nbsp;pos)))&nbsp;(s,&nbsp;pos)<br>
<br>
<span class="comment">(*&nbsp;parses&nbsp;all&nbsp;kinds&nbsp;of&nbsp;declarations&nbsp;include&nbsp;(classname#id1#id2)&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;class_and_ids&nbsp;=<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;((()))&nbsp;must&nbsp;be&nbsp;for&nbsp;padding,&nbsp;not&nbsp;for&nbsp;class&nbsp;((&nbsp;or&nbsp;something&nbsp;else&nbsp;*)</span><br>
&nbsp;&nbsp;p_char&nbsp;<span class="string">'('</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;p_until&nbsp;(p_pred&nbsp;((&lt;&gt;)&nbsp;<span class="string">'('</span>))&nbsp;(p_char&nbsp;<span class="string">')'</span>)&nbsp;&gt;&gt;=<br>
&nbsp;&nbsp;<span class="keyword">fun</span>&nbsp;(s,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;<span class="constructor">String</span>.nsplit&nbsp;s&nbsp;<span class="string">"#"</span>&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;[]&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;fail<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">""</span>&nbsp;::&nbsp;ids&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">List</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Id</span>&nbsp;x)&nbsp;ids)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;classname&nbsp;::&nbsp;ids&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((<span class="constructor">Class</span>&nbsp;classname)&nbsp;::&nbsp;(<span class="constructor">List</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Id</span>&nbsp;x)&nbsp;ids))<br>
<span class="keyword">let</span>&nbsp;style&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;p_char&nbsp;<span class="string">'{'</span>&nbsp;&gt;&gt;&gt;&nbsp;p_str_until&nbsp;(p_char&nbsp;<span class="string">'}'</span>)&nbsp;&gt;&gt;=&nbsp;p_string_not_empty<br>
<span class="keyword">let</span>&nbsp;language&nbsp;=&nbsp;p_char&nbsp;<span class="string">'['</span>&nbsp;&gt;&gt;&gt;&nbsp;p_str_until&nbsp;(p_char&nbsp;<span class="string">']'</span>)&nbsp;&gt;&gt;=&nbsp;p_string_not_empty<br>
<br>
<span class="keyword">let</span>&nbsp;attr_decl&nbsp;=<br>
&nbsp;&nbsp;class_and_ids&nbsp;|||<br>
&nbsp;&nbsp;(style&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;[<span class="constructor">Style</span>&nbsp;&nbsp;&nbsp;&nbsp;s])&nbsp;|||<br>
&nbsp;&nbsp;(language&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;[<span class="constructor">Language</span>&nbsp;s])<br>
<br>
<span class="comment">(*let&nbsp;attrs&nbsp;=<br>
&nbsp;&nbsp;p_manyf&nbsp;attr&nbsp;(fun&nbsp;acc&nbsp;x&nbsp;-&gt;&nbsp;x::acc)&nbsp;[]&nbsp;in*)</span><br>
<br>
<span class="comment">(*&nbsp;this&nbsp;is&nbsp;for&nbsp;correct&nbsp;parsing&nbsp;strings&nbsp;like&nbsp;_(hi)_&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;try_attrs&nbsp;f&nbsp;=<br>
&nbsp;&nbsp;(p_seq&nbsp;attr_decl&nbsp;&gt;&gt;=&nbsp;(return&nbsp;$&nbsp;<span class="constructor">List</span>.flatten)&nbsp;&gt;&gt;=&nbsp;f)&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*(p_plusf&nbsp;attr&nbsp;(fun&nbsp;acc&nbsp;x&nbsp;-&gt;&nbsp;x::acc)&nbsp;[]&nbsp;&gt;&gt;=&nbsp;f)&nbsp;|||*)</span><br>
&nbsp;&nbsp;(f&nbsp;[])<br>
<br>
<span class="keyword">let</span>&nbsp;img_float&nbsp;=<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'&lt;'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Float_left</span>)&nbsp;&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'&gt;'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Float_right</span>)<br>
<br>
<span class="comment">(*&nbsp;attributes&nbsp;+&nbsp;floating&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;img_opts&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;add_opt&nbsp;(attrs,&nbsp;float_opt)&nbsp;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Attr</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(a&nbsp;@&nbsp;attrs,&nbsp;float_opt)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Img_float</span>&nbsp;f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(attrs,&nbsp;<span class="constructor">Some</span>&nbsp;f)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;p_manyf<br>
&nbsp;&nbsp;&nbsp;&nbsp;((attr_decl&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Attr</span>&nbsp;a))&nbsp;|||&nbsp;(img_float&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Img_float</span>&nbsp;f)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;add_opt<br>
&nbsp;&nbsp;&nbsp;&nbsp;([],&nbsp;<span class="constructor">None</span>)<br>
<br>
<span class="comment">(*&nbsp;matches&nbsp;typical&nbsp;beginning&nbsp;of&nbsp;phrase:&nbsp;beginning&nbsp;of&nbsp;line&nbsp;or&nbsp;whitespace&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;begin_of_phrase&nbsp;begin_of_line&nbsp;follow&nbsp;=<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;why&nbsp;so&nbsp;unobvious&nbsp;solution?&nbsp;We&nbsp;can&nbsp;write&nbsp;it&nbsp;in&nbsp;that&nbsp;way:<br>
&nbsp;&nbsp;&nbsp;*&nbsp;begin_of_phrase&nbsp;begin_of_line&nbsp;=<br>
&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;p_pos&nbsp;begin_of_line&nbsp;|||&nbsp;p_whitespace&nbsp;||&nbsp;p_punct<br>
&nbsp;&nbsp;&nbsp;*&nbsp;but&nbsp;it&nbsp;willn't&nbsp;parse&nbsp;strings&nbsp;like&nbsp;(@code@)&nbsp;because&nbsp;it&nbsp;will&nbsp;detect<br>
&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;begin&nbsp;of&nbsp;line,&nbsp;then&nbsp;found&nbsp;'('&nbsp;which&nbsp;is&nbsp;not&nbsp;a&nbsp;modifier&nbsp;and&nbsp;all<br>
&nbsp;&nbsp;&nbsp;*&nbsp;parser&nbsp;fails.&nbsp;*)</span><br>
&nbsp;&nbsp;(p_pos&nbsp;begin_of_line&nbsp;&gt;&gt;&gt;&nbsp;follow)&nbsp;|||<br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;((p_whitespace)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;(p_pred&nbsp;(<span class="keyword">function</span>&nbsp;<span class="string">'('</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'\''</span>&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'"'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">false</span>)))&nbsp;&gt;&gt;&gt;&nbsp;follow<br>
&nbsp;&nbsp;)<br>
<br>
<span class="comment">(*&nbsp;matches&nbsp;typical&nbsp;end&nbsp;of&nbsp;phrase:&nbsp;end&nbsp;of&nbsp;line,&nbsp;whitespace,&nbsp;punctuation<br>
&nbsp;*&nbsp;doesn't&nbsp;jump&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;end_of_phrase&nbsp;=<br>
&nbsp;&nbsp;dont_jump<br>
&nbsp;&nbsp;&nbsp;&nbsp;(p_end&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_many&nbsp;p_punct&nbsp;&gt;&gt;&gt;&nbsp;(p_end&nbsp;|||&nbsp;(p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;()))))<br>
<br>
<span class="comment">(*&nbsp;The&nbsp;Great&nbsp;Function&nbsp;which&nbsp;collects&nbsp;CData&nbsp;and&nbsp;more&nbsp;interesting<br>
&nbsp;*&nbsp;phrases&nbsp;into&nbsp;line&nbsp;*)</span><br>
<span class="comment">(*&nbsp;it&nbsp;fails&nbsp;if&nbsp;[until]&nbsp;not&nbsp;reached&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;collect_phrases_with&nbsp;phrase&nbsp;until&nbsp;(s,&nbsp;begin_of_line)&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;loop&nbsp;acc&nbsp;beg&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;go_on&nbsp;()&nbsp;=&nbsp;loop&nbsp;acc&nbsp;beg&nbsp;(s,&nbsp;succ&nbsp;pos)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;phrase&nbsp;(s,&nbsp;pos)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;((phrase_r,&nbsp;last_cdata_pos),&nbsp;(s,&nbsp;next_p))&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;acc_values&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;do&nbsp;we&nbsp;have&nbsp;some&nbsp;cdata&nbsp;to&nbsp;save&nbsp;which&nbsp;was<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;before&nbsp;we&nbsp;found&nbsp;a&nbsp;phrase?&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;last_cdata_pos&nbsp;&lt;=&nbsp;beg<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">then</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[phrase_r]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;prev_cdata&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">CData</span>&nbsp;(<span class="constructor">String</span>.slice&nbsp;~first:beg&nbsp;~last:last_cdata_pos&nbsp;s)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[prev_cdata;&nbsp;phrase_r]&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;(<span class="constructor">List</span>.rev_append&nbsp;acc_values&nbsp;acc)&nbsp;next_p&nbsp;(s,&nbsp;next_p)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">match</span>&nbsp;until&nbsp;(s,&nbsp;pos)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(until_r,&nbsp;(s,&nbsp;new_pos))&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;pos&nbsp;=&nbsp;begin_of_line<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">then</span>&nbsp;go_on&nbsp;()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;acc&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;do&nbsp;we&nbsp;have&nbsp;some&nbsp;cdata&nbsp;to&nbsp;save&nbsp;which&nbsp;was<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;before&nbsp;we&nbsp;found&nbsp;a&nbsp;termination&nbsp;combinator?&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;beg&nbsp;=&nbsp;pos<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">then</span>&nbsp;acc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;last_cdata&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">CData</span>&nbsp;(<span class="constructor">String</span>.slice&nbsp;~first:beg&nbsp;~last:pos&nbsp;s)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_cdata::acc&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Parsed</span>&nbsp;((<span class="constructor">List</span>.rev&nbsp;acc,&nbsp;until_r),&nbsp;(s,&nbsp;new_pos))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span>&nbsp;pos&nbsp;&gt;=&nbsp;<span class="constructor">String</span>.length&nbsp;s<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">then</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;we&nbsp;have&nbsp;passed&nbsp;the&nbsp;whole&nbsp;string<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;and&nbsp;haven't&nbsp;catch&nbsp;a&nbsp;termination&nbsp;combinator&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Failed</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span>&nbsp;go_on&nbsp;())&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;loop&nbsp;[]&nbsp;begin_of_line&nbsp;(s,&nbsp;begin_of_line)<br>
<br>
<span class="keyword">let</span>&nbsp;phrase_surrounding&nbsp;end_of_phrase&nbsp;beg_of_line&nbsp;phrase&nbsp;=<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;phrases&nbsp;are&nbsp;usually&nbsp;surrounded&nbsp;with&nbsp;whitespaces,&nbsp;punctuation,<br>
&nbsp;&nbsp;&nbsp;*&nbsp;begining/ending&nbsp;of&nbsp;line&nbsp;—<br>
&nbsp;&nbsp;&nbsp;*&nbsp;every&nbsp;case&nbsp;described&nbsp;in&nbsp;begin_of_phrase&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;begin_of_phrase&nbsp;beg_of_line&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_pos&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;last_cdata_pos&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phrase&nbsp;end_of_phrase&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(r,&nbsp;last_cdata_pos))<br>
&nbsp;&nbsp;)<br>
&nbsp;&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;but&nbsp;phrases&nbsp;can&nbsp;also&nbsp;be&nbsp;surrounded&nbsp;with&nbsp;square&nbsp;brackets&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;XXX:&nbsp;this&nbsp;makes&nbsp;code&nbsp;about&nbsp;4x&nbsp;faster&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*current_pos&nbsp;&gt;&gt;=&nbsp;fun&nbsp;last_cdata_pos&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;'['&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;phrases&nbsp;last_cdata_pos&nbsp;(p_char&nbsp;']'&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'['</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;current_pos&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;_pos&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;phrase&nbsp;(p_char&nbsp;<span class="string">']'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(r,&nbsp;(_pos-1))<br>
&nbsp;&nbsp;)<br>
<br>
<span class="comment">(*&nbsp;separetely&nbsp;from&nbsp;other&nbsp;stuff&nbsp;—&nbsp;references&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;reference&nbsp;beg_of_line&nbsp;=<br>
&nbsp;&nbsp;(p_pos&nbsp;beg_of_line&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;(p_not_whitespace&nbsp;&gt;&gt;&gt;&nbsp;current_pos))&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;bracket&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;p_unsign_int&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;i&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;p_char&nbsp;<span class="string">']'</span>&nbsp;&gt;&gt;&gt;&nbsp;end_of_phrase&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;return&nbsp;((<span class="constructor">Reference</span>&nbsp;i),&nbsp;bracket-1)<br>
<br>
</code><table><tr><td></td><td><span class="comment">(** high level function which made for collecting phrases
    @param what phrases to parse; everything else is CData
    @param ended_with what can be at the end of phrase
    @param from where to start
    @param until end when this parser matched *)</span></td></tr></table><code class="code"><br>
<span class="keyword">let</span>&nbsp;collect&nbsp;~what&nbsp;~ended_with&nbsp;~from&nbsp;~until&nbsp;=<br>
&nbsp;&nbsp;collect_phrases_with<br>
&nbsp;&nbsp;&nbsp;&nbsp;((phrase_surrounding<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ended_with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;what)&nbsp;|||&nbsp;reference&nbsp;from)<br>
&nbsp;&nbsp;&nbsp;&nbsp;until<br>
<br>
<span class="comment">(*&nbsp;Hyprlinks&nbsp;can't&nbsp;contain&nbsp;another&nbsp;hyperlinks.<br>
&nbsp;*&nbsp;Therefore,&nbsp;there&nbsp;are&nbsp;two&nbsp;functions&nbsp;for&nbsp;parsing&nbsp;phrases&nbsp;—<br>
&nbsp;*&nbsp;one&nbsp;without&nbsp;hyperlinks...&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;phrases_except_hyperlinks&nbsp;end_of_phrase&nbsp;=<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;opened&nbsp;modifier&nbsp;should&nbsp;not&nbsp;be&nbsp;before&nbsp;whitespace&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;opened_modifier&nbsp;m&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;check_current&nbsp;p_not_whitespace&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;r&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;and&nbsp;closed&nbsp;modifier&nbsp;also&nbsp;should&nbsp;not&nbsp;be&nbsp;after&nbsp;whitespace&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;closed_modifier&nbsp;m&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;check_prev&nbsp;p_not_whitespace&nbsp;&gt;&gt;&gt;&nbsp;m&nbsp;&gt;&gt;&gt;&nbsp;end_of_phrase&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;there&nbsp;are&nbsp;general&nbsp;definition&nbsp;of&nbsp;simple&nbsp;phrases&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;sp&nbsp;modifier&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;opened_modifier&nbsp;modifier&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(f,&nbsp;cm)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;try_attrs&nbsp;(<span class="keyword">fun</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;current_pos&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;from&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;until&nbsp;=&nbsp;closed_modifier&nbsp;cm&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;collect<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~what:all_phrases<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~ended_with:(end_of_phrase&nbsp;|||&nbsp;(dont_jump&nbsp;until&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;()))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~from<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~until&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(line,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(f&nbsp;(a,&nbsp;line)))&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;remember&nbsp;that&nbsp;__&nbsp;and&nbsp;**&nbsp;must&nbsp;be&nbsp;first&nbsp;than&nbsp;_&nbsp;and&nbsp;*&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;simple_phrase&nbsp;(p_str&nbsp;"__")&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Italic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'_')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Emphasis&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_str&nbsp;"**")&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Bold&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'*')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Strong&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_str&nbsp;"??")&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Citation&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'-')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Deleted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'+')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Inserted&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'^')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Superscript&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'~')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Subscript&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'%')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Span&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;simple_phrase&nbsp;(p_char&nbsp;'@')&nbsp;(fun&nbsp;x&nbsp;-&gt;&nbsp;Code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x)&nbsp;|||*)</span><br>
&nbsp;&nbsp;sp&nbsp;(p_str&nbsp;<span class="string">"__"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Italic</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_str&nbsp;<span class="string">"__"</span>))&nbsp;|||<br>
&nbsp;&nbsp;sp&nbsp;(p_str&nbsp;<span class="string">"**"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Bold</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_str&nbsp;<span class="string">"**"</span>))&nbsp;|||<br>
&nbsp;&nbsp;sp&nbsp;(p_pred2&nbsp;(<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'_'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Emphasis</span>&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'_'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'*'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Strong</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'*'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'-'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Deleted</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'-'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'+'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Inserted</span>&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'+'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'^'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Superscript</span>&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'^'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'~'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Subscript</span>&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'~'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">'%'</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Span</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_char&nbsp;<span class="string">'%'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">None</span>))&nbsp;|||<br>
&nbsp;&nbsp;sp&nbsp;(p_str&nbsp;<span class="string">"??"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;((<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Citation</span>&nbsp;&nbsp;&nbsp;&nbsp;x),&nbsp;p_str&nbsp;<span class="string">"??"</span>))&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;and&nbsp;there&nbsp;are&nbsp;not&nbsp;too&nbsp;simple&nbsp;phrases&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;code&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;opened_modifier&nbsp;(p_char&nbsp;<span class="string">'@'</span>)&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;try_attrs&nbsp;(<span class="keyword">fun</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_str_until&nbsp;(closed_modifier&nbsp;(p_char&nbsp;<span class="string">'@'</span>))&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Code</span>&nbsp;(a,&nbsp;s)))<br>
&nbsp;&nbsp;)&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;notextile&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;opened_modifier&nbsp;(p_str&nbsp;<span class="string">"=="</span>)&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_str_until&nbsp;(closed_modifier&nbsp;(p_str&nbsp;<span class="string">"=="</span>))&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Notextile</span>&nbsp;s)<br>
&nbsp;&nbsp;)&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;image&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...:http://komar.bitcheese.net&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;link_opt&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">':'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_until&nbsp;(p_not_whitespace)&nbsp;end_of_phrase&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(url,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Some</span>&nbsp;url))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(end_of_phrase&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">None</span>)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...(title)!&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;end_with_title&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'('</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_str_until&nbsp;(p_str&nbsp;<span class="string">")!"</span>)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;title&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_opt&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;link_opt&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(title,&nbsp;link_opt)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...!&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;end_with_no_title&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'!'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_opt&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'!'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;img_opts&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(attrs,&nbsp;float)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_until&nbsp;p_not_whitespace&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(end_with_title&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(title,&nbsp;link_opt)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">Some</span>&nbsp;title,&nbsp;link_opt))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(end_with_no_title&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;link_opt&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">None</span>,&nbsp;link_opt))<br>
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(src,&nbsp;(title_opt,&nbsp;link_opt))&nbsp;<span class="keywordsign">-&gt;</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;r&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;image&nbsp;=&nbsp;<span class="constructor">Image</span>&nbsp;(attrs,&nbsp;float,&nbsp;src,&nbsp;title_opt)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;link_opt&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;url&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Link</span>&nbsp;(([],&nbsp;[image]),&nbsp;<span class="constructor">None</span>,&nbsp;url)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;image&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r<br>
&nbsp;&nbsp;)&nbsp;|||&nbsp;(<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;acronym&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_until<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_pred&nbsp;(<span class="keyword">fun</span>&nbsp;c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;c&nbsp;&gt;=&nbsp;<span class="string">'A'</span>&nbsp;<span class="keywordsign">&amp;&amp;</span>&nbsp;c&nbsp;&lt;=&nbsp;<span class="string">'Z'</span>))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'('</span>)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(acr,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_string_not_empty&nbsp;acr&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_str_until&nbsp;(p_char&nbsp;<span class="string">')'</span>&nbsp;&gt;&gt;&gt;&nbsp;end_of_phrase)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;desc&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*p_str_until&nbsp;(closed_modifier&nbsp;(p_char&nbsp;')'))&nbsp;&gt;&gt;=&nbsp;fun&nbsp;desc&nbsp;-&gt;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Acronym</span>&nbsp;(acr,&nbsp;desc))<br>
&nbsp;&nbsp;)<br>
<br>
<span class="comment">(*&nbsp;...&nbsp;and&nbsp;one&nbsp;with&nbsp;them.&nbsp;*)</span><br>
<span class="keyword">and</span>&nbsp;all_phrases&nbsp;end_of_phrase&nbsp;=<br>
&nbsp;&nbsp;(phrases_except_hyperlinks&nbsp;end_of_phrase)&nbsp;|||<br>
&nbsp;&nbsp;<span class="comment">(*&nbsp;hyperlink&nbsp;*)</span><br>
&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...:http://komar.bitcheese.net&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;url&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">':'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_until&nbsp;(p_not_whitespace)&nbsp;end_of_phrase&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(url,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;url&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...(title)''&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;end_with_title&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'('</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*p_str_until&nbsp;(check_prev&nbsp;p_not_whitespace&nbsp;&gt;&gt;&gt;&nbsp;p_str&nbsp;")\"")&nbsp;&gt;&gt;=&nbsp;fun&nbsp;title&nbsp;-&gt;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_str_until&nbsp;(p_str&nbsp;<span class="string">")\""</span>)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;title&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;url&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(title,&nbsp;url)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;...''&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;end_with_no_title&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*check_prev&nbsp;p_not_whitespace&nbsp;&gt;&gt;&gt;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'"'</span>&nbsp;&gt;&gt;&gt;&nbsp;url&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'"'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;XXX:&nbsp;hm&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;check_current&nbsp;p_not_whitespace&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;try_attrs&nbsp;(<span class="keyword">fun</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;current_pos&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;from&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;collect<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~what:phrases_except_hyperlinks<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~ended_with:(end_of_phrase&nbsp;|||&nbsp;dont_jump&nbsp;((end_with_title&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())&nbsp;|||&nbsp;(end_with_no_title&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~from<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~until:(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(end_with_title&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(title,&nbsp;url)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">Some</span>&nbsp;title,&nbsp;url))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(end_with_no_title&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;url&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">None</span>,&nbsp;url))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(line,&nbsp;(title_opt,&nbsp;url))&nbsp;<span class="keywordsign">-&gt;</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;r&nbsp;=&nbsp;<span class="constructor">Link</span>&nbsp;((a,&nbsp;line),&nbsp;title_opt,&nbsp;url)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;r)<br>
&nbsp;&nbsp;)<br>
<br>
<span class="keyword">let</span>&nbsp;line&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;(collect<br>
&nbsp;&nbsp;&nbsp;&nbsp;~what:all_phrases<br>
&nbsp;&nbsp;&nbsp;&nbsp;~ended_with:end_of_phrase<br>
&nbsp;&nbsp;&nbsp;&nbsp;~from:pos<br>
&nbsp;&nbsp;&nbsp;&nbsp;~until:p_end&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(line,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;return&nbsp;line)&nbsp;(s,&nbsp;pos)<br>
<br>
<span class="keyword">let</span>&nbsp;line_of_string&nbsp;s&nbsp;=<br>
&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;line&nbsp;(s,&nbsp;0)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(r,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;r<br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;empty_line<br>
<br>
<span class="keyword">let</span>&nbsp;align&nbsp;=<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"&lt;&gt;"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Justify</span>)&nbsp;|||&nbsp;<span class="comment">(*&nbsp;must&nbsp;be&nbsp;first&nbsp;*)</span><br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'&lt;'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Left</span>)&nbsp;&nbsp;&nbsp;&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'='</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Center</span>)&nbsp;&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'&gt;'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Right</span>)<br>
<br>
<span class="keyword">let</span>&nbsp;option&nbsp;=<br>
&nbsp;&nbsp;(attr_decl&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Attr</span>&nbsp;&nbsp;x))&nbsp;|||<br>
&nbsp;&nbsp;(align&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Align</span>&nbsp;x))&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'('</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keywordsign">`</span><span class="constructor">Left_padding</span>)&nbsp;&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">')'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keywordsign">`</span><span class="constructor">Right_padding</span>)<br>
<br>
<span class="comment">(*&nbsp;should&nbsp;we&nbsp;fix&nbsp;it?&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;add_option&nbsp;(attrs,&nbsp;talign,&nbsp;(lp,&nbsp;rp))&nbsp;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Attr</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(a&nbsp;@&nbsp;attrs,&nbsp;talign,&nbsp;(lp,&nbsp;rp))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;may&nbsp;be&nbsp;we&nbsp;need&nbsp;to&nbsp;add&nbsp;warning&nbsp;or&nbsp;something&nbsp;else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;when&nbsp;align&nbsp;is&nbsp;already&nbsp;set&nbsp;*)</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Align</span>&nbsp;a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(attrs,&nbsp;<span class="constructor">Some</span>&nbsp;a,&nbsp;(lp,&nbsp;rp))<br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Left_padding</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(attrs,&nbsp;talign,&nbsp;(succ&nbsp;lp,&nbsp;rp))<br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Right_padding</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(attrs,&nbsp;talign,&nbsp;(lp,&nbsp;succ&nbsp;rp))<br>
<br>
<span class="keyword">let</span>&nbsp;options&nbsp;=<br>
&nbsp;&nbsp;p_manyf&nbsp;option&nbsp;add_option&nbsp;default_options<br>
<br>
<span class="keyword">let</span>&nbsp;valign&nbsp;=<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'^'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Top</span>&nbsp;&nbsp;&nbsp;)&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'-'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Middle</span>)&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'~'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="constructor">Bottom</span>)<br>
<br>
<span class="keyword">let</span>&nbsp;tableoption&nbsp;=<br>
&nbsp;&nbsp;(option&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Option</span>&nbsp;x))&nbsp;|||<br>
&nbsp;&nbsp;(valign&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Valign</span>&nbsp;x))<br>
<span class="keyword">let</span>&nbsp;add_tableoption&nbsp;(opts,&nbsp;valign)&nbsp;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Valign</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(opts,&nbsp;<span class="constructor">Some</span>&nbsp;x)<br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Option</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(add_option&nbsp;opts&nbsp;x,&nbsp;valign)<br>
<span class="keyword">let</span>&nbsp;tableoptions&nbsp;=<br>
&nbsp;&nbsp;p_manyf&nbsp;tableoption&nbsp;add_tableoption&nbsp;default_tableoptions<br>
<span class="keyword">let</span>&nbsp;tableoptions_plus&nbsp;=<br>
&nbsp;&nbsp;p_plusf&nbsp;tableoption&nbsp;add_tableoption&nbsp;default_tableoptions<br>
<br>
<span class="keyword">let</span>&nbsp;block_type&nbsp;=<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'h'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_pred&nbsp;(<span class="keyword">fun</span>&nbsp;c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;c&nbsp;&gt;=&nbsp;<span class="string">'1'</span>&nbsp;<span class="keywordsign">&amp;&amp;</span>&nbsp;c&nbsp;&lt;=&nbsp;<span class="string">'6'</span>)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;c&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;(<span class="keywordsign">`</span><span class="constructor">Header</span>&nbsp;(num_of_char&nbsp;c))))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"bq"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blockquote</span>))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"fn"</span>&nbsp;&gt;&gt;&gt;&nbsp;p_unsign_int&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;i&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;(<span class="keywordsign">`</span><span class="constructor">Footnote</span>&nbsp;i)))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"bc"</span>&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blockcode</span>))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"pre"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Pre</span>))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"notextile"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blocknott</span>))&nbsp;|||<br>
&nbsp;&nbsp;(p_char&nbsp;<span class="string">'p'</span>&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Paragraph</span>))&nbsp;|||<br>
&nbsp;&nbsp;(p_str&nbsp;<span class="string">"table"</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keywordsign">`</span><span class="constructor">Table</span>)<br>
<br>
<span class="keyword">let</span>&nbsp;block_modifier&nbsp;=<br>
&nbsp;&nbsp;p_many&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;<span class="comment">(*&nbsp;skip&nbsp;whitespaces&nbsp;*)</span><br>
&nbsp;&nbsp;block_type&nbsp;&gt;&gt;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Table</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableoptions&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;topts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_opt&nbsp;()&nbsp;(p_char&nbsp;<span class="string">'.'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;())&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_many&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_end&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Table</span>&nbsp;topts)<br>
&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;bm&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;opts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'.'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((p_char&nbsp;<span class="string">'.'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keyword">true</span>)&nbsp;|||&nbsp;(return&nbsp;<span class="keyword">false</span>))&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;extended&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'&nbsp;'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*line&nbsp;&gt;&gt;=&nbsp;fun&nbsp;line&nbsp;-&gt;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*dont_jump&nbsp;p_somechar&nbsp;&gt;&gt;&gt;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;(bm,&nbsp;opts,&nbsp;extended))<br>
<br>
<span class="keyword">let</span>&nbsp;of_stream&nbsp;stream&nbsp;=<br>
<br>
&nbsp;&nbsp;<span class="comment">(*let&nbsp;get_content&nbsp;parse_first&nbsp;parse&nbsp;empty&nbsp;is_ext&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;rec&nbsp;loop&nbsp;acc&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;str&nbsp;=&nbsp;Stream.next&nbsp;stream&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse&nbsp;&gt;&gt;=&nbsp;fun&nbsp;r&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;(r::acc))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;is_ext<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(match&nbsp;Stream.peek&nbsp;stream&nbsp;with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;Some&nbsp;next_str&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*&nbsp;wtf&nbsp;am&nbsp;i&nbsp;writing&nbsp;*)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(fun&nbsp;_&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((block_modifier&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(List.rev&nbsp;acc))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(loop&nbsp;(empty::acc)))&nbsp;(next_str,&nbsp;0))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;None&nbsp;-&gt;&nbsp;return&nbsp;(List.rev&nbsp;acc))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;return&nbsp;(List.rev&nbsp;acc))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;(str,&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;Stream.Failure&nbsp;-&gt;&nbsp;(return&nbsp;(List.rev&nbsp;acc))&nbsp;(s,&nbsp;pos)&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;parse_first&nbsp;&gt;&gt;=&nbsp;fun&nbsp;first&nbsp;-&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;[first]&nbsp;in*)</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_content&nbsp;parse_first&nbsp;parse&nbsp;empty&nbsp;extended&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;loop&nbsp;acc&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;str&nbsp;=&nbsp;<span class="constructor">Stream</span>.next&nbsp;stream&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">match</span>&nbsp;parse&nbsp;(str,&nbsp;0)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(r,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;loop&nbsp;(r::acc)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keyword">when</span>&nbsp;extended&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">match</span>&nbsp;<span class="constructor">Stream</span>.peek&nbsp;stream&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;next_str&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">match</span>&nbsp;(block_modifier&nbsp;(next_str,&nbsp;0))&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">List</span>.rev&nbsp;acc<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(loop&nbsp;(empty::acc)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">List</span>.rev&nbsp;acc)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">List</span>.rev&nbsp;acc)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">Stream</span>.<span class="constructor">Failure</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">List</span>.rev&nbsp;acc&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;parse_first&nbsp;(s,&nbsp;pos)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(first,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(loop&nbsp;[first],&nbsp;(s,&nbsp;pos))<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_lines&nbsp;extended&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;parse_line&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;line&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;parse_first_line&nbsp;=&nbsp;line&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;get_content&nbsp;parse_first_line&nbsp;parse_line&nbsp;[]&nbsp;extended&nbsp;(s,&nbsp;pos)&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_strings&nbsp;extended&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;parse_string&nbsp;(s,&nbsp;pos)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;s&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="string">""</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Failed</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(s,&nbsp;(s,&nbsp;(<span class="constructor">String</span>.length&nbsp;s)))&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;parse_first_string&nbsp;(s,&nbsp;first)&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;s&nbsp;=&nbsp;<span class="constructor">String</span>.slice&nbsp;~first&nbsp;s&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parse_string&nbsp;(s,&nbsp;first)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;get_content&nbsp;parse_first_string&nbsp;parse_string&nbsp;<span class="string">""</span>&nbsp;extended&nbsp;(s,&nbsp;pos)&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;celloptions&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;option&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'_'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keywordsign">`</span><span class="constructor">Head</span>)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(tableoption&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Topt</span>&nbsp;x))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'\\'</span>&nbsp;&gt;&gt;&gt;&nbsp;p_int&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Colspan</span>&nbsp;x))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'/'</span>&nbsp;&nbsp;&gt;&gt;&gt;&nbsp;p_int&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="keywordsign">`</span><span class="constructor">Rowspan</span>&nbsp;x))&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;add&nbsp;(celltype,&nbsp;topts,&nbsp;((colspan,&nbsp;rowspan)&nbsp;<span class="keyword">as</span>&nbsp;cellspan))&nbsp;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Head</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="constructor">Head</span>,&nbsp;topts,&nbsp;cellspan)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Topt</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(celltype,&nbsp;add_tableoption&nbsp;topts&nbsp;x,&nbsp;cellspan)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Colspan</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(celltype,&nbsp;topts,&nbsp;(<span class="constructor">Some</span>&nbsp;x,&nbsp;rowspan))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Rowspan</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(celltype,&nbsp;topts,&nbsp;(colspan,&nbsp;<span class="constructor">Some</span>&nbsp;x))&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_plusf&nbsp;option&nbsp;add&nbsp;default_celloptions&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;element&nbsp;c&nbsp;prev_level&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;bullet&nbsp;=&nbsp;p_many&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;c&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;bullet&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_upto_timesf&nbsp;prev_level<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_many&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;c)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;l&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;succ&nbsp;l)&nbsp;1&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;lvl&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;if&nbsp;you&nbsp;remove&nbsp;line&nbsp;below,&nbsp;strings&nbsp;started&nbsp;with&nbsp;Strong&nbsp;text&nbsp;will&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;parsed&nbsp;as&nbsp;elements&nbsp;of&nbsp;list&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_plus&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;line&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(lvl,&nbsp;line)&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_element&nbsp;c&nbsp;prev_level&nbsp;x&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;<span class="constructor">Stream</span>.peek&nbsp;stream&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(element&nbsp;c&nbsp;prev_level&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;e&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Stream</span>.junk&nbsp;stream;&nbsp;e))&nbsp;(s,&nbsp;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_elements&nbsp;c&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;(p_char&nbsp;c)&nbsp;0&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;((f_e_lvl,&nbsp;_)&nbsp;<span class="keyword">as</span>&nbsp;first_element)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_manyf_arg<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;(prev_lvl,&nbsp;elements)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;get_element&nbsp;(p_char&nbsp;c)&nbsp;prev_lvl)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;(_,&nbsp;acc)&nbsp;(lvl,&nbsp;line)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;lvl,&nbsp;(lvl,&nbsp;line)::acc)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(f_e_lvl,&nbsp;[first_element])&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;(_,&nbsp;rev_elements)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">List</span>.rev&nbsp;(rev_elements))&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;row&nbsp;peeks&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME:&nbsp;must&nbsp;be&nbsp;clean!!!1111&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;peeks&nbsp;=&nbsp;ref&nbsp;peeks&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;suppose&nbsp;you&nbsp;has&nbsp;already&nbsp;parsed&nbsp;first&nbsp;'|'&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_cell&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;it's&nbsp;for&nbsp;|foo\nbar|<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;hate&nbsp;this&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;continue_cell&nbsp;x&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;loop&nbsp;acc&nbsp;cell_peeks&nbsp;x&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;peekn&nbsp;stream&nbsp;(!peeks&nbsp;+&nbsp;cell_peeks)&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Failed</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(collect<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~what:all_phrases<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~ended_with:(end_of_phrase&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;check&nbsp;if&nbsp;it&nbsp;works&nbsp;with&nbsp;|(@code@)|&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dont_jump&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_many&nbsp;p_punct&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;()))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~from:0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~until:(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keyword">true</span>)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_end&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keyword">false</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;line,&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(peeks&nbsp;:=&nbsp;!peeks&nbsp;+&nbsp;(succ&nbsp;cell_peeks);&nbsp;<span class="constructor">List</span>.rev&nbsp;(line::acc))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;line,&nbsp;<span class="keyword">false</span>&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;(line::acc)&nbsp;(succ&nbsp;cell_peeks)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;(s,&nbsp;0)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;[]&nbsp;0&nbsp;x&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_opt&nbsp;default_celloptions&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;celloptions&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;copts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_str&nbsp;<span class="string">".&nbsp;"</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;copts)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;copts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;empty&nbsp;cell&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;(empty_line,&nbsp;<span class="keyword">true</span>))&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(current_pos&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;beg_of_line&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collect<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~what:all_phrases<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~ended_with:(end_of_phrase&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dont_jump&nbsp;(p_many&nbsp;p_punct&nbsp;&gt;&gt;&gt;&nbsp;p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;()))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~from:beg_of_line<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~until:(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keyword">true</span>)&nbsp;|||<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(p_end&nbsp;&gt;&gt;&gt;&nbsp;return&nbsp;<span class="keyword">false</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;first_line,&nbsp;<span class="keyword">true</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(copts,&nbsp;[first_line])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;first_line,&nbsp;<span class="keyword">false</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;continue_cell&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;lines&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(copts,&nbsp;first_line::lines)&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_many&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;&nbsp;<span class="comment">(*&nbsp;skip&nbsp;whitespaces&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_opt&nbsp;default_tableoptions&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableoptions_plus&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;topts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'.'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_plus&nbsp;p_whitespace&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;topts)&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;topts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_char&nbsp;<span class="string">'|'</span>&nbsp;&gt;&gt;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;get_cell&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;first_cell&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;p_manyf_ends_with<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_cell<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;acc&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x&nbsp;::&nbsp;acc)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[first_cell]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p_end&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;rev_cells&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(njunk&nbsp;stream&nbsp;!peeks;&nbsp;(topts,&nbsp;<span class="constructor">List</span>.rev&nbsp;rev_cells))&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_extra_rows&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;p_seq<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;<span class="constructor">Stream</span>.peek&nbsp;stream&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Failed</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Some</span>&nbsp;s&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;row&nbsp;1&nbsp;(s,&nbsp;0))&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_rows&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;0&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;first_row&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;get_extra_rows&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;extra_rows&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(first_row::extra_rows)&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;get_block&nbsp;s&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;block&nbsp;marked&nbsp;with&nbsp;modifier&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(block_modifier&nbsp;&gt;&gt;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Textblock</span>&nbsp;(bm,&nbsp;opts,&nbsp;extended)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;lines&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;get_lines&nbsp;&nbsp;&nbsp;extended&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(f&nbsp;r)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;strings&nbsp;f&nbsp;=&nbsp;get_strings&nbsp;extended&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;r&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(f&nbsp;r)&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keyword">match</span>&nbsp;bm&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Header</span>&nbsp;lvl&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;lines&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Header</span>&nbsp;(lvl,&nbsp;(opts,&nbsp;x)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blockquote</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;lines&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Blockquote</span>&nbsp;&nbsp;&nbsp;(opts,&nbsp;x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Footnote</span>&nbsp;n&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;lines&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Footnote</span>&nbsp;(n,&nbsp;(opts,&nbsp;x)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blockcode</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;strings&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Blockcode</span>&nbsp;&nbsp;&nbsp;&nbsp;(opts,&nbsp;x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Pre</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;strings&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Pre</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(opts,&nbsp;x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Blocknott</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;strings&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Blocknott</span>&nbsp;&nbsp;&nbsp;&nbsp;(opts,&nbsp;x))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Paragraph</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;lines&nbsp;&nbsp;&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Paragraph</span>&nbsp;&nbsp;&nbsp;&nbsp;(opts,&nbsp;x)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Table</span>&nbsp;topts&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(get_extra_rows&nbsp;&gt;&gt;=&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;[]&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;fail<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;rows&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;&nbsp;return&nbsp;(<span class="constructor">Table</span>&nbsp;(topts,&nbsp;rows)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;only&nbsp;table&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;|||&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_rows&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;rows&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Table</span>&nbsp;(default_tableoptions,&nbsp;rows))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;bullist&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;|||&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_elements&nbsp;<span class="string">'*'</span>&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;el&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">Bulllist</span>&nbsp;el)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;numlist&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;|||&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_elements&nbsp;<span class="string">'#'</span>&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;el&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;return&nbsp;(<span class="constructor">Numlist</span>&nbsp;&nbsp;el)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;usual&nbsp;text&nbsp;paragraph&nbsp;*)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;|||&nbsp;(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_lines&nbsp;<span class="keyword">false</span>&nbsp;&gt;&gt;=&nbsp;<span class="keyword">fun</span>&nbsp;lines&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(<span class="constructor">Paragraph</span>&nbsp;(default_options,&nbsp;lines))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;(s,&nbsp;0)&nbsp;&gt;&gt;&nbsp;<span class="keyword">function</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Parsed</span>&nbsp;(r,&nbsp;_)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;r<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Failed</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">assert</span>&nbsp;<span class="keyword">false</span>&nbsp;<span class="comment">(*&nbsp;FIXME&nbsp;*)</span>&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;<span class="keyword">rec</span>&nbsp;next_block&nbsp;()&nbsp;=<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">match</span>&nbsp;<span class="constructor">Stream</span>.next&nbsp;stream&nbsp;<span class="keyword">with</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;&nbsp;<span class="string">""</span>&nbsp;&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;next_block&nbsp;()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;fstr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Some</span>&nbsp;(get_block&nbsp;fstr)<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">with</span>&nbsp;<span class="constructor">Stream</span>.<span class="constructor">Failure</span>&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">None</span>&nbsp;<span class="keyword">in</span><br>
<br>
&nbsp;&nbsp;<span class="constructor">Stream</span>.from&nbsp;(<span class="keyword">fun</span>&nbsp;_&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;next_block&nbsp;())<br>
<br>
</code></body></html>