/*! * Copyright (c) 2006 js-markdown-extra developers * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Converts Markdown formatted text to HTML. * @param text Markdown text * @return HTML */ String.prototype.Pandoc = function(options = {}){ return Pandoc( this, options); } Array.prototype.sum = function() { for (var i = 0, L = this.length, sum = 0; i < L; sum += this[i++]); return sum; } String.prototype.regexIndexOf = function (regex, startpos) { var indexOf = this.substring(startpos || 0).search(regex); return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; } Array.prototype.regexIndexOf = function (regex, startpos = 0) { for(var x = startpos, len = this.length; x < len; x++){ if(typeof this[x] != 'undefined' && (''+this[x]).match(regex)){ return x; } } return -1; } default_options = { pandoc : true, strict : false, html5: true, pan_xtables: true, md_extra: true, mdx_xtables : true, addcoordinates: true, debug: true, }; function Pandoc(text, options = {}) { console.clear(); console.group('options'); console.warn(options); for(opt in default_options){ console.log(opt, default_options[opt]); window[opt] = (typeof options[opt] == typeof default_options[opt] ? options[opt] : default_options[opt]); if(window[opt]==options[opt]){console.info(opt, options[opt]);}else{console.warn(opt, options[opt], 'wrong type');} } console.groupEnd(); if (!debug) { window.console = { assert: function() {}, clear: function() {}, count: function() {}, debug: function() {}, dir: function() {}, dirxml: function() {}, error: function() {}, exception: function() {}, group: function() {}, groupCollapsed: function() {}, groupEnd: function() {}, info: function() {}, log: function() {}, profile: function() {}, profileEnd: function() {}, table: function() {}, time: function() {}, timeEnd: function() {}, timeStamp: function() {}, trace: function() {}, warn: function() {}, }; } var headers_in_use = []; // For automatic header ids var html_to_text = false; // This will be a DOM element to put in html and get out raw text /* Utilities */ function Array_pad(target, size, value) { while(target.length < size) { target.push(value); } } function String_r(target, num) { var buf = ""; for(var i = 0; i < num; i++) { buf += target; } return buf; } function String_trim(target, charlist) { var chars = charlist || " \t\n\r"; return target.replace( new RegExp("^[" + chars + "]*|[" + chars + "]*$", "g"), "" ); } function String_rtrim(target, charlist) { var chars = charlist || " \t\n\r"; return target.replace( new RegExp( "[" + chars + "]*$", "g" ), "" ); } var md_urls = new Object; var md_titles = new Object; var md_html_blocks = new Object; var md_html_hashes = new Object; var md_list_level = 0; var md_footnotes = new Object; var md_footnotes_ordered = []; var md_footnote_counter = 1; var md_in_anchor = false; var md_empty_element_suffix = " />"; var md_tab_width = 4; var md_less_than_tab = md_tab_width - 1; var md_block_tags = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|form|fieldset|iframe|hr|legend'; var md_context_block_tags = "script|noscript|math|ins|del"; var md_contain_span_tags = "p|h[1-6]|li|dd|dt|td|th|legend"; var md_clean_tags = "script|math"; var md_auto_close_tags = 'hr|img'; /* var md_nested_brackets_depth = 6; var md_nested_brackets = String_r(String_r( '(?:[^\\[\\]]+|\\[', md_nested_brackets_depth ) + '\\])+', md_nested_brackets_depth ); */ var md_nested_brackets = '.*?(?:\\[.*?\\])?.*?'; var md_flag_StripLinkDefinitions_Z = "9082c5d1b2ef05415b0a1d3e43c2d7a6"; var md_reg_StripLinkDefinitions = new RegExp( '^[ ]{0,' + md_less_than_tab + '}\\[(.+)\\]:' + '[ \\t]*' + '\\n?' + '[ \\t]*' + '?' + '[ \\t]*' + '\\n?' + '[ \\t]*' + '(?:' + '(?=\\s)[\\s\\S]' + '["(]' + '(.*?)' + '[")]' + '[ \\t]*' + ')?' + '(?:\\n+|' + md_flag_StripLinkDefinitions_Z + ')' , "gm" ); function _StripLinkDefinitions( text ) { text += md_flag_StripLinkDefinitions_Z; var reg = md_reg_StripLinkDefinitions; text = text.replace( reg, function( $0, $1, $2, $3 ) { var link_id = $1.toLowerCase( ); md_urls[link_id] = _EncodeAmpsAndAngles( $2 ); if( $3 != "" && $3 != undefined ) md_titles[link_id] = $3.replace( /\"/, """ ); return ""; } ); return text.replace( md_flag_StripLinkDefinitions_Z, "" ); } var md_reg_VerticalGlue = new RegExp( '[ ]{0,' + md_less_than_tab + '}[.]{3,}\\n' + '((?:.*\\n)+)' + '[ ]{0,' + md_less_than_tab + '}[.]{3,}\\n' , "gm" ); function _VerticalGlue( text ){ var reg = md_reg_VerticalGlue; text = text.replace( reg, function( $0, $1 ) { var output = []; var columns = $1.split(/\n[.]{3,}\n/); var width = columns.length; for(var x = 0; x < width; x++){ columns[x] = columns[x].split(/\n/); var height = columns[x].length; for(var y = 0; y < height; y++){ output[y] = output[y] || ''; output[y] += columns[x][y]; } } return output.join('\n'); } ); return text; } // Footnotes function _StripFootnotes(text) { // // Strips link definitions from text, stores the URLs and titles in // hash references. less_than_tab = md_tab_width - 1; // Link defs are in the form: [^id]: url "optional title" text = text.replace(new RegExp('^[ ]{0,'+less_than_tab+'}\\[\\^(.+?)\\][ ]?:[ ]*\\n?((?:.+|\\n(?!\\[\\^.+?\\]:\\s)(?!\\n+[ ]{0,3}\\S))*)', 'mg'), function($0, $1, $2) { md_footnotes[$1] = _Outdent($2); return ''; }); return text; } function _DoFootnotes(text) { // // Replace footnote references in $text [^id] with a special text-token // which will be replaced by the actual footnote marker in appendFootnotes. if (!md_in_anchor) { text = text.replace(/\[\^(.+?)\]/g, function($0, $1) { return "F\x1Afn:" + $1 + "\x1A:" }); } return text; } function _AppendFootnotes(text) { // // Append footnote list to text. // text = text.replace(/F\x1Afn:(.*?)\x1A:/g, _appendFootnotes_callback); if (md_footnotes_ordered.length != 0) { text += "\n\n"; text += "
\n"; text += "↩"; if (footnote.match(/<\/p>$/)) { footnote = footnote.replace(/<\/p>$/, "") + " " + backlink + "

"; } else { footnote += "\n\n

" + backlink + "

"; } text += "
  • \n"; text += footnote + "\n"; text += "
  • \n\n"; } text += "\n"; text += "
    "; } return text; } function _appendFootnotes_callback($0, $1) { var node_id = $1; // Create footnote marker only if it has a corresponding footnote *and* // the footnote hasn't been used by another marker. if (md_footnotes[node_id]) { // Transfer footnote content to the ordered list. md_footnotes_ordered.push([node_id, md_footnotes[node_id]]); delete md_footnotes[node_id]; var num = md_footnote_counter++; var attr = " rel=\"footnote\""; attr = attr.replace("%%", num); node_id = _EncodeAttribute(node_id); return "" + "" + num + "" + ""; } return "[^" + $1 + "]"; } function _HashHTMLBlocks( text ) { text = _HashHTMLBlocks_InMarkdown( text )[0]; return text; } function _HashHTMLBlocks_InMarkdown( text, indent, enclosing_tag, md_span ) { indent = indent || 0; enclosing_tag = enclosing_tag || ""; md_span = md_span || false; if( text === "" ) return new Array( "", "" ); var newline_match_before = /(?:^\n?|\n\n)*$/g; var newline_match_after = /^(?:[ ]*)?[ ]*\n/g; var block_tag_match = new RegExp( '(' + '' + '|' + '' + '|' + '<\\?.*?\\?>' + '|' + '' + ')' ); var depth = 0; var parsed = ""; var block_text = ""; do { var r = text.match( block_tag_match ); if( r == null ) { if( md_span ) parsed += text.replace( /\n\n/g, "\n" ); else parsed += text; text = ""; break; } var parts = new Array( RegExp.leftContext, RegExp.lastMatch || RegExp.$1, RegExp.rightContext ); if( md_span ) parts[0] = parts[0].replace( /\n\n/g, "\n" ); parsed += parts[0]; var tag = parts[1]; text = parts[2]; var matches = parsed.match( /(^\n|\n\n)((.\n?)+?)$/ ); if( matches != null && ( matches[1].match( new RegExp( '^[ ]{' + ( indent + 4 ) + '}.*(\\n[ ]{' + ( indent + 4 ) + '}.*)*' + '(?!\\n)$/' ), "gm" ) || matches[1].match( /^(?:[^`]+|(`+)(?:[^`]+|(?!\1[^`])`)*?\1(?!`))*$/ ) == null ) ) { parsed += tag.charAt( 0 ); text = tag.substr( 1 ) + text; } else if( tag.match( new RegExp( '^<(?:' + md_block_tags + ')\\b' ) || ( tag.match( new RegExp( '^<(?:' + md_context_block_tags + ')\\b' ) ) && parsed.match( newline_match_before ) && text.match( newline_match_after ) ) ) ) { var parsed_array = _HashHTMLBlocks_InHTML( tag + text, _HashHTMLBlocks_HashBlock, true ); block_text = parsed_array[0]; text = parsed_array[1]; parsed += "\n\n" + block_text + "\n\n"; } else if ( tag.match( new RegExp( '^<(?:' + md_clean_tags + ')\\b' ) ) || tag.charAt( 1 ) == '!' || tag.charAt( 1 ) == '?' ) { var parsed_array = _HashHTMLBlocks_InHTML( tag + text, _HashHTMLBlocks_HashClean, false ); block_text = parsed_array[0]; text = parsed_array[1]; parsed += block_text; } else if ( enclosing_tag !== '' && tag.match( new RegExp( '^= 0 ); return new Array( parsed, text ); } var md_reg_HashHTMLBlocks = new RegExp( '(' + '' + '|' + '' + '|' + '<\\?[\\s\\S]*?\\?>' + '|' + '' + ')' ); function _HashHTMLBlocks_InHTML( text, hash_function, md_attr ) { if( text === '' ) return new Array( '', '' ); var markdown_attr_match = new RegExp( '\\s*' + 'markdown' + '\\s*=\\s*' + '(["\'])' + '(.*?)' + '\\1' ); var options_attr_match = new RegExp( '\\s*' + 'options' + '\\s*=\\s*' + '(["\'])' + '(.*?)' + '\\1' ); var original_text = text; var depth = 0; var block_text = ""; var parsed = ""; var base_tag_name = ""; var matches = text.match( /^<([\w:$]*)\b/ ); if( matches != null ) base_tag_name = matches[1]; do { var r = text.match( md_reg_HashHTMLBlocks ); if( r == null ) { return new Array( original_text.substr( 0, 1 ), original_text.substr( 1 ) ); } var parts = new Array( RegExp.leftContext, RegExp.lastMatch || RegExp.$1, RegExp.rightContext ); block_text += parts[0]; var tag = parts[1]; text = parts[2]; if( tag.match( new RegExp( '^ 0 ) { block_text = block_text.replace( new RegExp( '^[ ]{1,' + indent + '}', "gm" ), "" ); } if( !span_mode ) parsed += "\n\n" + block_text + "\n\n"; else parsed += block_text; block_text = ""; } else { block_text += tag; } } } while( depth > 0 ); parsed += hash_function( block_text ); // resetting for global for(opt in global_options){ window[opt] = global_options[opt]; } console.info('global_options:', global_options); console.log(parsed, '_', text); return new Array( parsed, text ); } function _HashHTMLBlocks_HashBlock( text ) { var key = _md5( text ); md_html_hashes[key] = text; md_html_blocks[key] = text; return key; } function _HashHTMLBlocks_HashClean( text ) { var key = _md5( text ); md_html_hashes[key] = text; return key; } function _HashBlock( text ) { text = _UnhashTags( text ); return _HashHTMLBlocks_HashBlock( text ); } function _RunBlockGamut( text, hash_html_blocks ) { hash_html_blocks = ( hash_html_blocks == undefined ); if(pandoc){ text = _DoSimpleTables( text ); } if ( hash_html_blocks ) { text = _HashHTMLBlocks( text ); } text = _DoHeaders( text ); text = _DoTables( text ); if(pandoc){ text = _DoGrids( text ); } text = text .replace( /^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, _HashBlock( "\n?' + '[ \\t]*' + '(' + '([\'"])' + '(.*?)' + '\\5' + ')?' + '\\)' + ')' , "g" ); function _DoAnchors( text ) { if (md_in_anchor) return text; md_in_anchor = true; var reg = md_reg_DoAnchors1; text = text.replace( reg, _DoAnchors_reference_callback ); var reg = md_reg_DoAnchors2; text = text.replace( reg, _DoAnchors_inline_callback ); md_in_anchor = false; return text; } function _DoAnchors_reference_callback( $0, $1, $2, $3 ) { var whole_match = $1; var link_text = $2; var link_id = $3.toLowerCase( ); var result = ""; if( link_id == "" ) { link_id = link_text.toLowerCase( ); } if( md_urls[link_id] ) { var url = md_urls[link_id]; url = _EscapeItalicsAndBold( url ); result = '"; } else { result = whole_match; } return result; } function _DoAnchors_inline_callback( $0, $1, $2, $3, $4, $5, $6 ) { var whole_match = $1; var link_text = $2; var url = $3; var title = $6; var url = _EscapeItalicsAndBold( url ); var result = '"; return result; } var md_reg_DoImages1 = new RegExp( '(' + '!\\[' + '(' + md_nested_brackets + ')' + '\\]' + '[ ]?' + '(?:\\n[ ]*)?' + '\\[' + '(.*?)' + '\\]' + ')' , "g" ); var md_reg_DoImages2 = new RegExp( '(' + '!\\[' + '(' + md_nested_brackets + ')' + '\\]' + '\\(' + '[ \\t]*' + '?' + '[ \\t]*' + '(' + '([\'"])' + '(.*?)' + '\\5' + '[ \\t]*' + ')?' + '\\)' + ')' , "g" ); function _DoImages( text ) { var reg = md_reg_DoImages1; text = text.replace( reg, _DoImages_reference_callback ); var reg = md_reg_DoImages2; text = text.replace( reg, _DoImages_inline_callback ); return text; } function _DoImages_reference_callback( $0, $1, $2, $3 ) { var whole_match = $1; var alt_text = $2; var link_id = $3.toLowerCase( ); var result = ""; if ( link_id == "" ) { link_id = alt_text.toLowerCase( ); } alt_text = alt_text.replace( /\"/, '"' ); if( md_urls[link_id] ) { var url = md_urls[link_id]; url = _EscapeItalicsAndBold( url ); result = '' + alt_text + '"; return _HashBlock( str ) + "\n\n"; } ); var reg = md_reg_DoAtxHeaders; text = text.replace( reg, function( $0, $1, $2, $3 ) { [, dashes, plusminus] = $1.match(/(#+)([=+-]*)/); level = (plusminus.length==0 ? dashes.length : (window.previouslevel || 1)); for(var c=0, len = plusminus.length; c"; return _HashBlock( str ) + "\n\n"; } ); return text; } function _RunHeaderId( header_id = '', already_used_array = false){ console.group(header_id); // * Remove all formatting, links, etc. html_to_text = html_to_text || document.createElement('span'); html_to_text.innerHTML = header_id; header_id = html_to_text.textContent; html_to_text.innerHTML = ''; // alternative removal of html; doesn't decode html html_to_text like & //header_id = header_id.replace(/\<[^>]*\>?/g, ''); // remove leading and trailing spaces and newlines header_id = header_id.replace(/^[\s\n]*|[\s\n]$/g, ''); // replace en and em dashes with -- and --- header_id = header_id.replace(/–/g, '--').replace(/—/g, '---'); // * Replace all spaces and newlines with hyphens. header_id = header_id.replace(/[\s\n\‐\‐]/g, '-'); // I included special hyphens // * Remove all punctuation, except underscores, hyphens, and periods. header_id = header_id.replace(/[^\w-._]/g, ''); // * Convert all alphabetic characters to lowercase. header_id = header_id.toLowerCase(); // * Remove everything up to the first letter (identifiers may not begin with a number or punctuation mark). header_id = header_id.replace(/^[\W\d]*/, ''); // * If nothing is left after this, use the identifier "section". header_id = ( header_id == '' ? 'section' : header_id ); // when several headers have the same text; in this case, the first will get an identifier as described above; the second will get the same identifier with -1 appended; the third with -2; and so on. if(!already_used_array){ if(typeof headers_in_use=='undefined'){ headers_in_use = []; } already_used_array = headers_in_use; } var new_header = header_id; var new_counter = 1; while( already_used_array.indexOf(new_header)>=0 ){ new_header = header_id + '-' + new_counter; new_counter++; } if(new_header != header_id){ header_id = new_header; console.warn('renamed to:' + header_id); } console.info('#'+header_id); console.groupEnd(); return header_id; } var md_flag_DoTables = "9882b282ede0f5af55034471410cfc46"; var md_reg_DoTables1 = new RegExp( '^' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionabove + '\\n' + ')?' + '[ ]{0,' + md_less_than_tab + '}' + '(' + '(?:' + '(?:(?:[|^].*|.*[|^].*)\\n)' // |header |header | + '(?:(?:[\'].*|.*[\'].*)\\n)*' // !more !more ! + ')*?' + '(?:[ ]*[-=|: ]*[|][-=|: ]*)\\n' // | ----- |=======| or ------|====== + ')' + '(' + '(?:' + '(?:(?:[|^].*|.*[|^].*)\\n)' // |content|content| + '(?:(?:[\'].*|.*[\'].*)\\n)*?' // !more !more ! + ')+?' + ')' + '(?:(' + '(?:[ ]*[-=|:]*[|][-=|:]*)\\n' // |-------|=======| or ------|====== + '(?:' + '(?:(?:[|^].*|.*[|^].*)\\n)' // |footer |footer | + '(?:(?:[\'].*|.*[\'].*)\\n)*' // !more !more ! + ')*' + '))?' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '\\n' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionbelow + ')?' + '(?=\\n|' + md_flag_DoTables + ')'//Stop at final double newline. , "gm" ); function _DoTables( text ) { text += md_flag_DoTables; var reg = md_reg_DoTables1; text = text.replace( reg, function( $0, $1, $2, $3, $4, $5 ) { console.clear(); //console.log('0:\n'+$0, '\n\n1:\n'+$1, '\n\n2:\n'+$2, '\n\n3:\n'+$3 ); return _DoTable_callback( $0, $1, $2, $3, $4, $5 ); } ); text = text.replace( md_flag_DoTables, "" ); return text; } function _DoTable_callback( $0, captionabove = '', head = '', body = '', foot = '', captionbelow = '' ) { var head_rows = head.split( /\n/ ); var body_rows = body.split( /\n/ ); var foot_rows = foot.split( /\n/ ); head_rows.pop(); body_rows.pop(); foot_rows.pop(); console.log('captionabove',captionabove); console.log(head_rows.join('\n')); console.log(body_rows.join('\n')); console.log(foot_rows.join('\n')); console.log('captionbelow',captionbelow); // var underline = head_rows[head_rows.length-1].replace(/^[ ]*(?![|^'])/gm, '|').replace(/[|^'\n]*$/, ''); // var overline = foot_rows[0].replace(/^[ ]*(?![|^'])/gm, '|').replace(/[|^'\n]*$/, '').split(/\n/); var underline = head_rows.length; var und = underline; var overline = underline + body_rows.length +1; console.log('underline:', underline, 'overline:', overline); //underline = underline.replace( /[|][ ]*$/gm, '' ).replace( /[ ]*/gm, '' ).replace( /[=]/g, '-' ); //content = content.replace( /[|][ ]*$/gm, '' ); var h_align_all = []; var v_align_all = []; colgroup = []; var v_header = []; var colname = []; var rowname = []; var table = []; if(head_rows.length > 0){var table = table.concat(head_rows);} if(body_rows.length > 0){var table = table.concat(body_rows);} if(foot_rows.length > 0){var table = table.concat(foot_rows);} //var thead = []; //var tbody = []; var two_dim_arr = []; //var area = 'thead'; theadsize = 0; tbodysize = 0; tfootsize = 0; rownum = 1; two_dim_arr[0] = []; //this enables you to even start your table with `'` or `^` cells (in case you get loonatic) function fillrowuntil(rownum, colnum){ tn = {}; beforelength = two_dim_arr[rownum].length; console.info( typeof two_dim_arr[rownum][beforelength-1] == 'object' ? two_dim_arr[rownum][beforelength-1].colnum + two_dim_arr[rownum][beforelength-1].colspan : 0+1); var pointer = ( typeof two_dim_arr[rownum][beforelength-1] == 'object' ? two_dim_arr[rownum][beforelength-1].colnum + two_dim_arr[rownum][beforelength-1].colspan : 0+1); for(pointer; pointer <= colnum; pointer ++){ tn.raw = '|'; tn.text = ' ' + '\n'; tn.l = ' '; tn.r = ' '; tn.colnum = pointer; tn.rownum = rownum; tn.colspan = 1; tn.rowspan = 1; tn.height = 1; tn.h_align = 'default'; tn.v_align = 'default'; two_dim_arr[rownum].push(tn); console.warn('this row was extended to be able to put the content somewhere'); console.log(two_dim_arr[rownum]); } } for(y=0, rows_len = table.length; y < rows_len; y++ ){ console.group('y:', y); two_dim_arr[rownum] = []; table[y] = table[y] //remove trailing spaces and the last bar .replace( /[|^'][ \n]*$/gm, '' ) //remove leading spaces and add first bar if needed .replace(/^[ ]*(?![|^'])/gm, '|') // split before the seperator that is not followed by another seperator (which is needed for colspan!) .split(/(?=[|^'][^|^'])/); console.log(table[y]); colnum = 0; advance = false; for(x=0, cols_len = table[y].length; x < cols_len; x++ ){ console.group('x:', x, 'colnum:'+colnum); td = {}; raw = table[y][x]; //[, s, l, text, r, z] = raw.match(/^([|^'])([:;]?)(.*?)([:;]?)(\d+|[|^']*)$/); [, s, l, text, r, z] = raw.match(/^([|^'])([:;]?)(.*?)([:;]?)([|^']*)$/); l = (l=='' ? ' ' : l); r = (r=='' ? ' ' : r); console.log([s,l,text,r,z]); var pointer = rownum; switch(s){ case "|": h_align_srt = (l == ':' && r == ':' ? 'center' : l == ':' ? 'left' : r == ':' ? 'right' : 'default'); h_align_end = (l == ';' && r == ';' ? 'center' : l == ';' ? 'left' : r == ';' ? 'right' : 'default'); if (h_align_srt != 'default') { h_align = h_align_srt; h_align_all[colnum] = h_align_srt; console.log('start', h_align); td.v_align_to_right = true; console.warn('the next one will take my v_align'); } else if (h_align_end != 'default') { h_align = h_align_end; h_align_all[colnum] = 'default'; console.log('end/singlecell', h_align); } else { console.log('else'); h_align = h_align_all[colnum] || 'default'; } h_align_all[colnum] = h_align_all[colnum] || 'default'; if(!(y+1==underline || y+1==overline)){ //fillrowuntil(rownum, colnum-1); advance = true; td.raw = raw; td.l = l; td.r = r; td.text = text + '\n'; td.colnum = colnum; td.rownum = rownum; td.height = 1; td.colspan = z.length+1; //td.colspan = ( z.match(/\d+/) ? z*1 : z.length+1 ); td.rowspan = 1; td.h_align = h_align; td.v_align = 'default'; if(v_header[colnum]==true){ td.th = true; rowname[rownum] = _RunHeaderId(String_trim(text)); } if(yoverline){ td.th = true; colname[colnum] = _RunHeaderId(String_trim(text)); } if(colname[colnum]){ td.colname = colname[colnum]; } if(rowname[rownum]){ td.rowname = rowname[rownum]; } console.log(s,l,text,r,td.colspan, h_align); two_dim_arr[rownum][colnum] = td; colnum += td.colspan; } else { if(text.match(/[=]/)){ v_header[colnum] = true; console.log(v_header); } if(y+1==underline){ colgroup[colnum] = raw.length; console.log('colgroup:',colgroup); } colnum += ( z.match(/\d+/) ? z*1 : z.length+1 ); } break; case "^": if(!(y+1==underline || y+1==overline)){ console.log(two_dim_arr[pointer].length-1,colnum); fillrowuntil(pointer, colnum); while(pointer > 0 && typeof two_dim_arr[pointer][colnum]=='undefined'){ pointer--; console.warn(two_dim_arr[pointer][colnum]); tu = two_dim_arr[pointer][colnum]; } tu.rowspan ++; if(colnum>=two_dim_arr[rownum-1].length){ console.error('cannot extend rowspan of nonexisting cell'); } } case "'": if(!(y+1==underline || y+1==overline)){ fillrowuntil(rownum-1, colnum); while(pointer > 0 && typeof two_dim_arr[pointer][colnum]=='undefined'){ pointer--; console.warn(two_dim_arr[pointer][colnum]); tu = two_dim_arr[pointer][colnum]; } if(colnum'+row+'\n'; }*/ if(advance){ rownum++; } console.info('y:', y); if(y+1==underline-1){ theadsize = rownum; console.log('theadsize:',theadsize); } else if(y+1==overline-1){ tbodysize = rownum - theadsize; console.log('tbodysize:',tbodysize); } else if(y==rows_len-1){ tfootsize = rownum - theadsize - tbodysize; console.log('tfootsize:',tfootsize); } /*if(y==und){ output += '\n'; } else if(y==rows_len-1){ output += '\n'; }*/ console.groupEnd(); } output = ''; if(two_dim_arr[0].length == 0){two_dim_arr.shift();theadsize--;} if(two_dim_arr[two_dim_arr.length-1].length == 0){two_dim_arr.pop();} console.log(two_dim_arr); output += _printTable( two_dim_arr, [theadsize, tbodysize, tfootsize], [captionabove, captionbelow] ); return _HashBlock( output ) + "\n"; } function _printTable( two_dim_arr, [theadsize, tbodysize, tfootsize], [captionabove, captionbelow], cols = false){ spitoutabove = captionabove; spitoutbelow = captionbelow; captionabove = String_trim(captionabove).replace(/^(Table)?[:]/, ''); captionbelow = String_trim(captionbelow).replace(/^(Table)?[:]/, ''); captionabove = (captionabove=='' ? false : captionabove ); captionbelow = (captionbelow=='' ? false : captionbelow ); caption = (captionabove || captionbelow ); console.log(captionabove); console.log(captionbelow); var output = (captionabove ? '' : spitoutabove + '\n' ); //spit out the first table header if it doesnt contain anything output += '\n'; output += ( caption ? '\n' : ''); if(cols){ // columns = 80; total = cols.sum(); divisor = ( total > columns ? total : columns ); var cols_length = cols.length; for (var x = 0; x < cols_length; x++) { var percent = Math.round( cols[x]*100/divisor ); if(html5){ //output += '\n'; output += '\n'; } else{ //output += '\n'; output += '\n'; } } } theadbodyfootsize = two_dim_arr.length; for(var rownum=0; rownum < theadbodyfootsize; rownum++){ //output += '<'+(rownum\n'; output += (theadsize && rownum==0 ? '\n' : rownum==theadsize ? '\n': rownum==theadsize+tbodysize ? '\n': ''); if(typeof two_dim_arr[rownum] != 'undefined'){ output += '\n'; two_dim_arr_rownum_length = (two_dim_arr[rownum] || []).length; for(var colnum = 0; colnum < two_dim_arr_rownum_length; colnum++){ var td = two_dim_arr[rownum][colnum]; console.log(td); if( typeof td != 'undefined'){ console.log(rownum, colnum, td.text); block = _RunBlockGamut( (td.text||'').replace(/[ ]*$/gm, '') ); // if the block only consists of the first paragraph if( (block.match(/^

    [\s\S]*?<\/p>/) || [''])[0].length == block.length){ // strip away the

    block = block.replace(/^

    |<\/p>$/g, ''); } //tc = (rownum=theadsize+tbodysize ? 'th' : 'td'); tc = (td.th ? 'th' : 'td'); var colspan = (td.colspan>1 ? ' colspan="'+td.colspan+'"': ''); var rowspan = (td.rowspan>1 ? ' rowspan="'+td.rowspan+'"': ''); var coord = (addcoordinates ? ' class="r'+td.rownum+' c'+td.colnum+' r'+(td.rownum % 2 == 0 ? 'o' : 'e')+' c'+(td.colnum % 2 == 0 ? 'o' : 'e')+(td.colname ? ' c_'+td.colname : '')+(td.rowname ? ' r_'+td.rowname : '')+'"' : ''); td.v_align = (td.v_align=='justify' ? 'middle' : td.v_align); var style = ''; if( td.h_align!='default' || td.v_align!='default' ){ if(html5){ style = ' style="'; style += (td.h_align!='default' ? 'text-align:'+td.h_align+';' : ''); style += (td.v_align!='default' ? 'vertical-align:'+td.v_align+';' : ''); style += '"'; } else { style += (td.h_align!='default' ? ' align="'+td.h_align+'"' : ''); style += (td.v_align!='default' ? ' valign="'+td.v_align+'"' : ''); } } output += '<'+tc+colspan+rowspan+coord+style+'>'+block+'\n'; } } output += '

    \n'; } console.log((rownum==theadsize-1 ? '\n' : rownum==theadsize+tbodysize-1 ? '\n' : rownum==theadsize+tbodysize+tfootsize-1 ? '\n' : '')); output += (rownum==theadsize-1 ? '\n' : rownum==theadsize+tbodysize-1 ? '\n' : rownum==theadsize+tbodysize+tfootsize-1 ? '\n' : ''); } output += '
    ' + _RunSpanGamut( caption ) + '
    '; output += ( captionbelow ? captionabove ? '\n' + spitoutbelow : '' : '\n' + spitoutbelow ); // spit out the superfluous second table caption console.log(output); return output; } var md_flag_DoSimpleTables = "d0dd78840fdffb4bf1f8d9e65a42d778"; /*var md_reg_DoSimpleTables = new RegExp( '^' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionabove + '\\n' + ')?' + '([ ]{0,' + md_less_than_tab + '}' + '[-]+[ ]*\\n)?' // ---------------- + '((?:[^\\n]+\\n(?:\\n(?!\\n))?)*)' // header header header + '([ ]*[-=]*[ ]+[-= ]*)\\n' // ------- ------- ------- + '((?:[^\\n]+\\n(?:\\n(?!\\n))?)+?)' // content content content + '([-= ]*[-=][-= ]*\\n)?' // ------ ------ ---- + '(' + '[ ]{0,' + md_less_than_tab + '}' + '\\n' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionbelow + ')?' + '(?=\\n|' + md_flag_DoTables + ')' //Stop at final double newline. , "gm" );*/ var md_reg_DoSimpleTables = new RegExp( '^' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionabove + '\\n' + ')?' + '([ ]{0,' + md_less_than_tab + '}' + '[-]+[ ]*\\n)?' // ---------------- + '((?:[^\\n]+\\n\\n?)*)' // header header header + '([ ]*[-=]*[ ]+[-= ]*)\\n' // ------- ------- ------- + '((?:[^\\n]+\\n\\n?)+?)' // content content content + '([-= ]*[-=][-= ]*\\n)?' // ------ ------ ---- + '(' + '[ ]{0,' + md_less_than_tab + '}' + '\\n' + '(?:Table[:]|[:])[\\S\\s]*?[^\\n]\\n' // captionbelow + ')?' + '(?=\\n|' + md_flag_DoTables + ')' //Stop at final double newline. , "gm" ); function _DoSimpleTables( text ) { text += md_flag_DoSimpleTables; var reg = md_reg_DoSimpleTables; text = text.replace( reg, function( $0, captionabove, lineabove, header, dashes, content, linebelow, captionbelow ) { console.clear(); console.log('captionabove:', captionabove); console.log(' lineabove:', lineabove); console.log(' header:', header); console.log(' dashes:', dashes); console.log(' content:', content); console.log(' linebelow:', linebelow); console.log('captionbelow:', captionbelow); var position = 0; columns = dashes.split(/[ ](?=[-=])/); rows = content.split( /^\n/m ); headers = header.split( /^\n/m ); if( header == '' && linebelow == '' ){ return $0; } else if( lineabove == '' ){ console.info('simple table'); rows = content.split( /^/m ); if(linebelow == ''){ rows.pop(); } headers = header.split( /^/m ); var first_is_header = (header=='' ? 0 : headers.length); rows = [].concat(headers, rows); var two_dim_arr = []; var cols = []; var v_header = []; var wholerow_align = []; var ignore = []; for(var c = 0, len = columns.length; c < len; c ++){ console.group(c, len, c+1==len); srt = position; end = (c+1==len ? undefined : position += columns[c].length+1); cols.push(columns[c].replace(/\s/g, '').length); console.log(srt, columns[c], end, columns[c].match(/[=]/)); if(columns[c].match(/[=]/)){ v_header[c] = true; } var height = rows.length; var killer = [0,0]; for(var r = 0; r < height; r++){ two_dim_arr[r] = two_dim_arr[r] || []; ignore[r] = ignore[r] || -1; console.group('r=', r, '; c=', c, '; ignore[',r,']=', ignore[r]); var cell = ''; var whiteborder = ''; multirows = rows[r].split(/^/m); for(var m = 0, m_height = multirows.length; m < m_height; m++){ cell += multirows[m].substring(srt, end) + '\n'; whiteborder += multirows[m].substring(srt-1, srt); } console.log(c+1, r+1); console.log(cell); if(killer[1] > 0){ console.error('killer', killer); for(var i = killer[0]; i > 0; i-- ){ delete two_dim_arr[r][c-i]; } killer[1]--; } else{ arrow = cell.match(/^\s*(\<{1,2}|\^{1,2})\s*$/); automatic_colspan = whiteborder.match(/\S/); //(arrow) var rowpointer = r; var colpointer = c; if(automatic_colspan || ( arrow && (arrow[1] == "<" || arrow[1] == "<<") && c > 0 ) ){ console.warn('<< or <'); while( (typeof two_dim_arr[r][colpointer] == "undefined" || ( !automatic_colspan && arrow[1]=="<<" && String_trim(two_dim_arr[r][colpointer].text)=='' ) ) && colpointer > 0){ delete two_dim_arr[r][colpointer]; console.warn(r, colpointer, ' cell deleted'); colpointer--; } if(automatic_colspan){ console.warn('automatic_colspan'); //console.log(cell.split(/^/m), two_dim_arr[r][colpointer].raw.substr(0,two_dim_arr[r][colpointer].raw.length-1).split(/\n/g)); addto = two_dim_arr[r][colpointer].raw.substr(0,two_dim_arr[r][colpointer].raw.length-1).split(/\n/g); add = cell.split(/^/m); var resultcell = ''; for(var m = 0, m_height = add.length; m < m_height; m++){ resultcell += (addto[m]||'') + (add[m]||'\n'); } two_dim_arr[r][colpointer].raw = resultcell; two_dim_arr[r][colpointer].text = resultcell; } console.info(c-colpointer); killer[0] = two_dim_arr[r][colpointer].colspan = c-colpointer+1; killer[1] = two_dim_arr[r][colpointer].rowspan-1; } else if(arrow && (arrow[1] == "^" || arrow[1] == "^^") && r > 0){ console.warn('^^ or ^'); while( (typeof two_dim_arr[rowpointer][c] == "undefined" || ( arrow[1]=="^^" && String_trim(two_dim_arr[rowpointer][c].text)=='' ) ) && rowpointer > 0){ delete two_dim_arr[rowpointer][c]; console.warn(r, colpointer, ' cell deleted'); rowpointer--; } console.info(r-rowpointer); if(typeof two_dim_arr[rowpointer][c] != "undefined" ){ two_dim_arr[rowpointer][c].rowspan = r-rowpointer+1; } } else{ two_dim_arr[r][c] = {raw:cell, text:cell, h_align:'left', v_align:'default', colnum:c+1, rownum:r+1}; } if( typeof two_dim_arr[r][c] !="undefined" && (v_header[c]==true || r < first_is_header)){ two_dim_arr[r][c].th = true; } if( r == 0 || r < first_is_header ){ var left_white = ( two_dim_arr[r][colpointer].text.match(/^(\s*)/)[1] != '' ); var right_white = two_dim_arr[r][colpointer].text.replace(/\s*$/, '').length < columns.slice().splice(colpointer, c-colpointer+1).join(' ').replace(/\s*$/, '').length; console.error(left_white, right_white); wholerow_align[colpointer] = (two_dim_arr[r][colpointer].text.match(/\S/) ? (left_white && right_white ? 'center' : ( right_white ? 'left' : ( left_white ? 'right' : 'default' ) ) ) : 'left' ); } if( typeof wholerow_align[colpointer] != 'undefined' && typeof two_dim_arr[r][colpointer] != 'undefined' ){ two_dim_arr[r][colpointer].h_align = wholerow_align[colpointer]; } ignore[r] = -1; } console.groupEnd(); } console.groupEnd(); } // Pandoc doesn't pay attention to width in simple tables cols = []; } else{ console.warn('multiline table'); rows = content.replace(/\n$/, '').split( /\n/m ); headers = header.replace(/\n$/, '').split( /\n/m ); var headers_length = headers.length; console.log('headers_length:', headers_length); rows = [].concat(headers, '', rows); console.log(rows); var two_dim_arr = []; var delete_array = []; var cols = []; var v_header = []; var height = rows.length; console.groupCollapsed('fetching raw table cells'); for(var r = 0; r < height; r++){ console.group('r:', r); var position = 0; var row_empty = true; two_dim_arr[r] = []; if(r == 0 ||r == headers_length ){ console.warn('first row in body or header'); } for(var c = 0, len = columns.length; c < len; c ++){ console.group('c:', c); srt = position; end = (c+1==len ? undefined : position += columns[c].length+1); cell = rows[r].substring(srt, end); while (cell.length < end-srt) { cell += ' '; } if(r == 0 && columns[c].match(/[=]/)){ v_header[c] = true; } if(r == 0){ cols[c] = columns[c].replace(/\s/g, '').length; } console.info(cell); two_dim_arr[r][c] = {text:cell}; //whiteborder = rows[r].substring(srt-1, srt); console.groupEnd(); } console.groupEnd(); } console.groupEnd(); console.group('merging spaning cells'); var height = two_dim_arr.length; var rownum = 0; var rowspan_array = []; for(var r = 0; r < height; r++){ console.group(r, r <= headers_length); rownum++; var width = two_dim_arr[r].length; var colnum = 0; var anycell = false; if(rows[r].match(/^\s*$/)){ console.warn('this line is empty; deleting ...'); two_dim_arr[r] = undefined; console.groupEnd(); } else{ for(var c = 0; c < width; c ++){ if(typeof two_dim_arr[r][c] == 'object' && typeof two_dim_arr[r][c].text == 'string' && two_dim_arr[r][c].text.match(/\S/)){ anycell = true; colnum++; two_dim_arr[r][c].colnum = colnum; two_dim_arr[r][c].rownum = rownum; two_dim_arr[r][c].h_align = 'default'; two_dim_arr[r][c].v_align = 'default'; console.group(c); var rowspan = 1; var colspan = 1; var leftspan = 0; var upspan = 0; var limit = 20; var counter = 0; var end = false; rowspan_array[c] = 0; while(!end){ console.info(two_dim_arr[r-upspan][c-leftspan].text); counter++; var rightborder = (two_dim_arr[r-upspan][c-leftspan].text ? two_dim_arr[r-upspan][c-leftspan].text.replace(/.(?!$)/gm, '') : ''); console.log(rightborder); if(c+colspan < len && rightborder.match(/\S/)){ colspan++; colnum++; two_dim_arr[r-upspan][c-leftspan].colspan = colspan; console.warn('merging cells horizontally', two_dim_arr[r-upspan][c-leftspan].colspan); var addto = two_dim_arr[r-upspan][c-leftspan].text.split(/\n/g); console.log('addto:', addto); var addto_length = addto.length; two_dim_arr[r-upspan][c-leftspan].text = ''; for(var a = 0; a < rowspan; a++){ console.log(r-upspan, a, c-leftspan, colspan, two_dim_arr[r-upspan+a][c-leftspan+colspan-1]); two_dim_arr[r-upspan][c-leftspan].text += (a!=0 ? '\n' : '') + (addto[a] || '') + (two_dim_arr[r-upspan+a][c-leftspan+colspan-1] ? two_dim_arr[r-upspan+a][c-leftspan+colspan-1].text : ''); two_dim_arr[r-upspan+a][c-leftspan+colspan-1] = undefined; } } else { console.log(r-upspan, rowspan, c-leftspan); var belowborder = ''; if(two_dim_arr[r-upspan+rowspan]){ for(var w = 0; w < colspan; w++){ belowborder += (two_dim_arr[r-upspan+rowspan][c-leftspan+w] ? two_dim_arr[r-upspan+rowspan][c-leftspan+w].text : ''); } console.log('belowborder:', belowborder); console.log(belowborder.match(/\S/)); } if(belowborder.match(/\S/)){ for(var w = 0; w < colspan; w++){ two_dim_arr[r-upspan+rowspan][c-leftspan+w] = undefined; } rowspan++; rowspan_array[c] = r; two_dim_arr[r-upspan][c-leftspan].height = rowspan; two_dim_arr[r-upspan][c-leftspan].text += '\n' + belowborder; } else{ var leftborder = ''; var add = []; for(var a = 0; a < rowspan; a++){ add.push(two_dim_arr[r-upspan+a][c-leftspan-1] ? two_dim_arr[r-upspan+a][c-leftspan-1].text : ''); } leftborder = add.join('').replace(/.(?!$)/gm, ''); console.log('leftborder:', leftborder); if( c-leftspan > 0 && leftborder.match(/\S/) ){ console.error(two_dim_arr[r-upspan][c-leftspan]); var addto = two_dim_arr[r-upspan][c-leftspan].text.split(/\n/g); two_dim_arr[r-upspan][c-leftspan] = undefined; leftspan++; colspan++; two_dim_arr[r-upspan][c-leftspan] = {text:'', v_align:'default', h_align:'default', rownum:rownum, colnum:colnum, rowspan:rowspan, colspan:colspan}; console.log('addto:', addto); for(var a = 0; a < rowspan; a++){ two_dim_arr[r-upspan][c-leftspan].text += (a!=0 ? '\n' : '') + (add[a] || '') + (addto[a] || ''); if(a!=0){console.error(two_dim_arr[r-upspan+a][c-leftspan].text);two_dim_arr[r-upspan+a][c-leftspan] = undefined;} } } else { var upborder = ''; if(r-upspan-1 > 0 && two_dim_arr[r-upspan-1]){ console.log(r-upspan, rowspan, c-leftspan); for(var w = 0; w < colspan; w++){ upborder += (two_dim_arr[r-upspan-1][c-leftspan+w] ? two_dim_arr[r-upspan-1][c-leftspan+w].text : ''); } console.log('upborder:', upborder); console.log(upborder.match(/\S/)); } if(upborder.match(/\S/)){ for(var w = 0; w < colspan; w++){ if(w!=0){two_dim_arr[r-upspan-1][c-leftspan+w] = undefined;} } upspan++; rowspan++; two_dim_arr[r-upspan][c-leftspan] = two_dim_arr[r-upspan+1][c-leftspan]; //two_dim_arr[r-upspan][c-leftspan].rowspan = rowspan; two_dim_arr[r-upspan][c-leftspan].rownum--; two_dim_arr[r-upspan][c-leftspan].text = upborder + '\n' + two_dim_arr[r-upspan][c-leftspan].text; two_dim_arr[r-upspan+1][c-leftspan] = undefined; } else{ two_dim_arr[r-upspan][c-leftspan].text += '\n'; end = true; } } } } if(counter>limit){ console.error('get me out of that while loop! I don´t want to overflow.'); end = true; } } if(r <= headers_length || v_header[c-leftspan]){ two_dim_arr[r-upspan][c-leftspan].th = true; } console.groupEnd(); console.log({arr:two_dim_arr}); } else if(two_dim_arr[r][c] != undefined){ console.group(c); two_dim_arr[r][c] = {text:'', h_align:'default', v_align:'default', colnum:colnum, rownum:rownum}; if(r <= headers_length || v_header[c-leftspan]){ two_dim_arr[r][c].th = true; } console.log('empty'); console.groupEnd(); } else{ two_dim_arr[r][c] = undefined; } } console.groupEnd(); console.group('check if any cell, add rowspans'); if(anycell){ console.log(two_dim_arr[r], rowspan_array); var anycell = false; var two_dim_arr_r_length = two_dim_arr[r].length; for (i=0; i0 && typeof two_dim_arr[r][i] == 'undefined' && typeof two_dim_arr[rowspan_array[i]][i] != 'undefined' && rowspan_array[i]+two_dim_arr[rowspan_array[i]][i].height >= r){ two_dim_arr[rowspan_array[i]][i].rowspan = two_dim_arr[rowspan_array[i]][i].rowspan+1 || 2; console.log(two_dim_arr[rowspan_array[i]][i].rowspan, rowspan_array); } if(typeof two_dim_arr[r][i] != 'undefined' && two_dim_arr[r][i].text != ''){ anycell = true; console.log('real cell found'); //break; } } } if(!anycell){rownum--;two_dim_arr[r] = undefined;} console.groupEnd(); } } console.groupEnd(); } console.log(two_dim_arr, [headers_length, height-headers_length, 0], [captionabove, captionbelow], cols); return _printTable( two_dim_arr, [headers_length, height-headers_length, 0], [captionabove, captionbelow], cols); } ); text = text.replace( md_flag_DoSimpleTables, "" ); return text; } var md_flag_DoGrids = "3ee63c2476f49cd6c03c72e14687b4f7"; var md_reg_DoGrids1 = new RegExp( (pan_xtables ? '^' + '(?:' + '[ ]{0,' + md_less_than_tab + '}' + '(?:[Tt]able[:]|[Tt]abelle[:]|[:])([\\S\\s]*?[^\\n])\\n' // Multilingual, ignore case // for exactly one blank line before the table use ([\\S\\s]*?[^\\n]) + '\\n' + ')?' + '(' + '([ ]{0,' + md_less_than_tab + '})' + '[+](?:[-=:; ]+[+])+[ ]*\\n' // +---------+---------+ + '\\3' + '(?:(?:[^\\n]+)[ ]*\\n)+' // | content | content | + '\\3' + '[+](?:[-=:; ]+[+])+[ ]*\\n' // +---------+---------+ + ')' + '(' + '\\n' // exactly one blank line after the tables + '(?:[Tt]able[:]|[Tt]abelle[:]|[:])([\\S\\s]*?)\\n' // Multilingual + ')?' + '(?=\\n|' + md_flag_DoGrids + ')'//Stop at final double newline. : // original pandoc tables: '^' + '(?:' + '[ ]{0,' + md_less_than_tab + '}' + '(?:Table[:]|[:])([\\S\\s]*?)\\n' + '\\n' + ')?' + '(()' + '[+](?:[-]+[+])+[ ]*\\n(?!\\n)' // +---------+---------+ + '(?:' + '(?:[|][^\\n]+[ ]*\\n)+' // | header | header | + '[+](?:[=]+[+])+[ ]*\\n' // +=========+=========+ + ')?' + '(?:' + '(?:[|][^\\n]+[ ]*\\n)+' // | content | content | + '[+](?:[-]+[+])+[ ]*\\n' // +---------+---------+ + ')*' + ')' + '(' + '\\n+' + '(?:Table[:]|[:])([\\S\\s]*?)\\n' + ')?' + '(?=\\n|' + md_flag_DoGrids + ')'//Stop at final double newline. ) , "gm"); function _DoGrids( text ) { text += md_flag_DoGrids; var reg = md_reg_DoGrids1; text = text.replace( reg, function( $0, $1, $2, indent, $3, $4 ) { console.log( $0, 'h1', $1, 'table',$2, 'indent', indent, 'h2',$3, $4 ); //$0 = $0.replace( /^[ ]*/gm, '' ); return _DoGrid_callback( $0, $1, $2,indent, $3, $4 ); } ); text = text.replace( md_flag_DoGrids, "" ); return text; } function _DoGrid_callback( $0, captionabove, table, indent,spitoutbelow, captionbelow ) { if(pan_xtables){ endoflinebug = false; //console.clear(); if(debug){console.log(new Date());} default_h_align = 'left'; default_v_align = 'default'; markdown = false; arr = table.split('\n'); longest = 0; arr[arr.length] = ''; // this is for lookahead, see d = arr[y2+1].charAt(x2); table = []; rows = []; var h_align_all = []; var v_align_all = []; var indices = []; for (i = 0; i < arr.length; i++) { arr[i] = arr[i].substr(indent.length); while (arr[i].length < longest) { arr[i] += ' '; } longest = arr[i].length; r = 0; x2 = -1; if(debug){console.warn(i);} while (arr[i].indexOf('+', r) >= 0) { ind = arr[i].indexOf('+', r); if (i > 1) { if(debug){console.log(indices.join(''));} x1 = ind * 1 || 0; x2 = indices.regexIndexOf(/\d/, ind + 1) * 1 || 0; y1 = indices[ind] * 1 || 0; y2 = i * 1 || 0; if (x2 < 0) { if(debug){console.warn('end of columns');} rows[rows.length] = i; break; } else { if(debug){console.info([x1, y1], [x2, y2]);} } // a | // bzc -+- // d | a = arr[y2 - 1].charAt(x2); b = arr[y2].charAt(x2 - 1); c = arr[y2].charAt(x2 + 1); d = arr[y2 + 1].charAt(x2); z = arr[y2].charAt(x2); border = {}; border['top'] = arr[y1].substring(x1 + 1, x2); border['bottom'] = arr[y2].substring(x1 + 1, x2); //console.log('{'+border['bottom']+'}', !border['bottom'].match(/^[-+=:; ]+$/) ); border['left'] = border['right'] = ''; for (y = y1 + 1; y < y2; y++) { text += arr[y].substring(x1 + 1, x2) + '\n'; border['left'] += arr[y].substr(x1, 1); border['right'] += arr[y].substr(x2, 1); } colspan = 1; // horizontal traverse while (z.match(/[ -]/) || ( // a _ // bzc -+- // d # a == ' ' && b.match(/[-=:;]/) && c.match(/[-=:;]/) && d.match(/[|=:; ]|$/) ) || !border['right'].match(/^[|+=:; ]+$/) // see "J" in the example ) { if (a == ' ' && b.match(/[-=:;]/) && c.match(/[-=:;]/) && d.match(/[|=:; ]|$/) || !border['right'].match(/^[|+=:; ]+$/) ) { indices[x2] = i; console.warn(a + '\n' + b + z + c + '\n' + d); } colspan++; x2 = indices.regexIndexOf(/\d/, x2 + 1) * 1; if (x2 < 0 || arr[y2].charAt(x2 + 1) == '') { if(debug){console.error('end of columns in hor traverse!');} rows[rows.length] = i; endoflinebug = true; break; } a = arr[y2 - 1].charAt(x2); b = arr[y2].charAt(x2 - 1); c = arr[y2].charAt(x2 + 1); d = arr[y2 + 1].charAt(x2); z = arr[y2].charAt(x2); border['top'] = arr[y1].substring(x1 + 1, x2); border['bottom'] = arr[y2].substring(x1 + 1, x2); //console.log('{'+border['bottom']+'}', !border['bottom'].match(/^[-+=:; ]+$/) ); border['left'] = border['right'] = ''; for (y = y1 + 1; y < y2; y++) { text += arr[y].substring(x1 + 1, x2) + '\n'; border['left'] += arr[y].substr(x1, 1); border['right'] += arr[y].substr(x2, 1); } if(z.match(/[ -]/)){ console.log('z: ', z); } if(debug){console.log([x1, y1], [x2, y2], colspan);} } // Use this syntax to combine A and E with rowspan: // "#" is a placeholder for either one of the characters [-=: X] (including space(" ") and edges ("X")). // "_" is a placeholder for a space (" "). // The first table is standard grid style. The second table is "lazy" grid style. // If any character other than one of the characters [-=:; X] (as above) gets // anywhere in the way of the supposed line (In this case "J"), A and E get automatically // combined (see examples three and four). // // +---+---+---+ | + + + + | +---+---+---+ | + + + + // | A | B | C | | A B | C | | A | B | C | | A B C // +---+ _+#--+ | + + _+# + | +---+ J +---+ | + + J + + // | D | E | F | | D E | F | | D | E | F | | D E F // +---+---+---+ | + + + + | +---+---+---+ | + + + + // | G | H | I | | G H I | | G | H | I | | G H I // +---+---+---+ | + + + + | +---+---+---+ | + + + + // // The same applies for combining the cells D and E horizontally, with rowspan: // Of course "#" now stands for [|=:; X], with "|" instead of "-". // // +---+---+---+ | + + + + | +---+---+---+ | + + + + // | A | B | C | | A B | C | | A | B | C | | A B C // +---+---+---+ | + + + + | +---+---+---+ | + + + + // | D _ E | F | | D _ E | F | | D J E | F | | D J E F // +---+---+---+ | + -+- + + | +---+---+---+ | + + + + // | G # H | I | | G # H I | | G | H | I | | G H I // +---+---+---+ | + + + + | +---+---+---+ | + + + + // if ( z == '+' && a.match(/[ |=:;+]/) && b.match(/[ -=:;+]/) && !( // a | // b+c _+# // d | a.match(/[|=:;]/) && b == ' ' && c.match(/[-=:; ]|$/) && d.match(/[|=:;]/) ) && border['bottom'].match(/^[-+=:; ]+$/) // see "J" in the example || endoflinebug ) { text = ''; // text-align // ========== // The borders of the gridtable must consist of the // following characters: `-` for horizontal lines, `|` (for // vertical lines), `=` (for headers), `:` (for sticky alignment), // `;` (for single alignment) or space (for automatic lines). // // horizontal alignment // -------------------- // `;----` will align the cell below it *left*. // `----;` will align the cell below it *right*. // `;---;` will align the cell below it *justified*. // `--;--` will align the cell below it *centered*; the ';' // can be anywhere in the middle. // (`;--"."--`, `--"."--;`, `;--"."--;`, `--;"."--` or // `.;----`, `-----;.`, `.;----;.`, `--;.;--` are planned // to align the cell below it *to the char* between the `"`s.) // // If you use `:` instead of `;`, all of the following cells in // the same *column* will be aligned until another single cell // alignment stops it again. // // vertical alignment // -------------------- // `;||||` will align the cell below it *left*. // `||||;` will align the cell below it *right*. // `;|||;` will align the cell below it *justified*. // `||;||` will align the cell below it *centered*; the ';' // can be anywhere in the middle. // // If you use `:` instead of `;`, all of the following cells in // the same *row* will be aligned until another single cell // alignment stops it again. // border['left'] = border['right'] = ''; for (y = y1 + 1; y < y2; y++) { text += arr[y].substring(x1 + 1, x2) + '\n'; border['left'] += arr[y].substr(x1, 1); border['right'] += arr[y].substr(x2, 1); } //console.log(text); //console.log(border); l = border['top'].charAt(0); r = border['top'].charAt(border['top'].length - 1); t = border['left'].charAt(0); b = border['left'].charAt(border['left'].length - 1); h_align_srt = (l == ':' && r == ':' ? 'justify' : l == ':' ? 'left' : r == ':' ? 'right' : border['top'].match(/^[-=+ ]+[:]+[-=+ ]+$/) ? 'center' : 'default'); h_align_end = (l == ';' && r == ';' ? 'justify' : l == ';' ? 'left' : r == ';' ? 'right' : border['top'].match(/^[-=+ ]+[;]+[-=+ ]+$/) ? 'center' : 'default'); if (h_align_srt != 'default') { h_align = h_align_srt; h_align_all[ind] = h_align_srt; } else if (h_align_end != 'default') { h_align = h_align_end; h_align_all[ind] = 'default'; } else { h_align = h_align_all[ind] || 'default'; } if(h_align == 'default' && default_h_align){ h_align = default_h_align; } v_align_srt = (t == ':' && b == ':' ? 'middle' : t == ':' ? 'top' : b == ':' ? 'bottom' : border['left'].match(/^[|=+ ]+[:]+[|=+ ]+$/) ? 'middle' : 'default'); v_align_end = (t == ';' && b == ';' ? 'middle' : t == ';' ? 'top' : b == ';' ? 'bottom' : border['left'].match(/^[|=+ ]+[;]+[|=+ ]+$/) ? 'middle' : 'default'); if (v_align_srt != 'default') { v_align = v_align_srt; v_align_all[i] = v_align_srt; } else if (v_align_end != 'default') { v_align = v_align_end; v_align_all[i] = 'default'; } else { v_align = v_align_all[i] || 'default'; } if(v_align == 'default' && default_v_align){ v_align = default_v_align; } header = border['bottom'].indexOf('=') > -1 || border['right'].indexOf('=') > -1; //console.log(rows, rows.length-rows.indexOf(y1)); rowspan = rows.length - rows.indexOf(y1); html = (header ? ' 1 ? ' colspan="' + colspan + '"' : ''); html += (rowspan > 1 ? ' rowspan="' + rowspan + '"' : ''); html += '>'; text = text.replace(/[ ]*$/gm, ''); // otherwise " " would trigger
    block = _RunBlockGamut( text ); // if the block only consists of the first paragraph if( (block.match(/^

    [\s\S]*?<\/p>/) || [''])[0].length == block.length){ // strip away the

    block = block.replace(/^

    |<\/p>$/g, ''); } html += block; html += (header ? '' : ''); if(debug){console.log(html);} table[y1] = table[y1] || []; table[y1][x1] = html; while (indices.length < ind) { indices.push('_'); } indices[ind] = i; //indices_change = true; } else if(debug){ console.error(''); if (!border['bottom'].match(/^[-+=:; ]+$/)) { blanks = ''; while (blanks.length < border['bottom'].length) { blanks += ' '; } console.log(blanks + a + ' \n' + border['bottom'] + z + c + '\n' + blanks + d + ' '); } else { console.log(' ' + a + ' \n' + b + z + c + '\n ' + d + ' '); } } } if (/*i > 1 || */typeof indices[ind] == 'undefined') { if(debug){console.log('initializing');} while (indices.length < ind) { indices.push('_'); } indices[ind] = i; //indices_change = true; if(debug){console.log(indices);} } r = (x2 < 0 ? ind + 1 : x2); if(debug){console.log('ind:' + ind, 'x2:' + (x2 < 0 ? ind + 1 : x2));} } } output = '\n'; output += ( (captionabove || captionbelow) ? '\n' : ''); rownum = 0; colnum = 0; thead = 1; // columns = 80; prevind = 0; total = indices.length; divisor = ( total > columns ? total : columns ); for (x = 0; x < total; x++) { if (indices[x] != '_' && x > 0) { output += '\n'; prevind = x; } } for (y = 0; y < table.length; y++) { if (typeof table[y] != 'undefined') { row = ''; for (x = 0; x < table[y].length; x++) { if (typeof table[y][x] != 'undefined') { row += table[y][x] + '\n'; if (thead == 1 && table[y][x].substr(0, 3) != '=3){ row = '\n' + row; } else{ row = '\n' + row; } if (thead == 1) { row = '\n' + row; thead = 2; } else if (thead == 3) { row = '\n\n' + row; thead = 5; rownum = 0; // reset the rownumbering for the tbody } else if (thead == 4) { row = '\n' + row; thead = 5; } row += '\n'; output += row; } } if (thead==2){ output += '\n\n\n'; } else if(thead==5){ output += '\n'; } output += '
    ' + _RunSpanGamut(captionabove || captionbelow) + '
    '; output += (captionabove ? '\n' + spitoutbelow : ''); // spit out the superfluous second table caption console.log(output); return _HashBlock( output ) + "\n"; } else { var two_dim_arr = []; var arr = table.split(/[+](?:[-=]+[+])+[ ]*\n/); var first_row = table.substring(1,table.indexOf('\n')-1).split('+'); var first_row_length = first_row.length; var first_is_header = table.match(/\n[+]([-=])/)[1] == '=' ? 1 : 0; console.log(first_is_header); arr.shift(); arr.pop(); var cols = []; console.log(arr.length); var arr_length = arr.length; for(var row = 0; row= 27) { next = (next - 1) / 26 - (next - 1) % 26 / 26; zeros += next * Math.pow(27, generation); generation++; } return (input + zeros).toString(27).replace(/./g, function ($0) { return '_abcdefghijklmnopqrstuvwxyz'.charAt(parseInt($0, 27)); }); } function roman2int(input) { romans = { 'm': 1000, 'd': 500, 'c': 100, 'l': 50, 'x': 10, 'v': 5, 'i': 1 }; input = input.replace(/[^A-z]/, '').toLowerCase(); output = 0; highest = false; for (i = input.length - 1; i >= 0; i--) { num = romans[input.substr(i, 1)] || 0; highest = (num > highest ? num : highest); output = (num < highest ? (output - num) : (output + num)); } return output; } function int2roman(number) { // http://www.blackwasp.co.uk/NumberToRoman_2.aspx result = ""; values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]; numerals = ["m", "cm", "d", "cd", "c", "xc", "l", "xl", "x", "ix", "v", "iv", "i"]; for (i = 0; i < 13; i++) { while (number >= values[i]) { number -= values[i]; result += numerals[i]; } } return result; } function _DoLists( text ) { var md_marker_ul = '[*+-]'; var md_marker_ol = (pandoc ? (strict ? '#[.]|\\d+[.]|[(]?\\d+[)]|[(]?\\d+[.][)]|' + '[(]?[A-z][)]|[(]?[A-z][.][)]|[A-Z][.][ ]|[a-z][.]|' + '[(]?[IVXLCDMivxlcdm]+[)]|[(]?[IVXLCDMivxlcdm]+[.][)]|[IVXLCDM]+[.][ ]|[ivxlcdm]+[.]' : '#[.]|\\d+[.]|[(]?\\d+[)]|[(]?\\d+[.][)]|' + '[(]?[A-z]+[)][ ]*|[(]?[A-z]+[.:][)][ ]*|[A-Z]{1,2}[.:][ ][ ]*|[a-z]{1,2}[.:][ ]*|' + '[(]?[IVXLCDMivxlcdm]+[)][ ]*|[(]?[IVXLCDMivxlcdm]+[.:][)][ ]*|[IVXLCDM]+[.:][ ][ ]*|[ivxlcdm]+[.:][ ]*') : (strict ? '\\d+[.]' : '\\d+[.]') ); var md_markers = new Array( md_marker_ul, md_marker_ol ); for( var i = 0, len = md_markers.length; i < len; i++ ) { var marker = md_markers[i]; if ( md_list_level ) var prefix = (pandoc ? '(\\n)':'(^)'); else var prefix = '(?:(\\n\\n)|^\\n?)'; text = text + md_flag_DoLists_z; var reg = new RegExp( prefix + '(' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '(' + marker + ')' + '[ \\t]+' + ')' + '(?:[\\s\\S]+?)' + '(' + md_flag_DoLists_z + '|' + '\\n{2,}' + '(?=\\S)' + '(?!' + '[ \\t]*' + marker + '[ \\t]+' + ')' + ')' + ')' , (pandoc ? 'g':'gm') ); text = text.replace( reg, function( $0, $1, $2, $3, $4 ) { $2 = $2.replace( md_flag_DoLists_z, "" ); var list = $2; var list_type = $4.match( new RegExp( md_marker_ul ) ) != null ? "ul" : "ol"; if(list_type=="ol"){ var letter = $4.replace(/\W/g, ''); // not i v x : [A-HJ-UWY-Za-hj-uwy-z] // i. v. x. l: c: d: m: mm. ivxlcdm. if($4.match( /^[ivx][^:](?![ ]{2})|^[lcdm](?:[:]|[^:][ ]{2})|^[ivxlcdm]{2,}[^:](?![ ]{2})/i) ){var params = ' type="'+(letter.toLowerCase()==letter ? 'i':'I')+'" start="'+roman2int(letter)+'"';} // // test for matching: // var abc = "abcdefghijklmnopqrstuvwxyz"; // for(i=0;i<26;i++){ // console.log((abc[i]+'.'), (abc[i]+'.').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // console.log((abc[i]+'. '), (abc[i]+'. ').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // console.log((abc[i]+':'), (abc[i]+':').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // } // for(i=1;i<26;i++){ // console.log(('c'+abc[i]+'.'), ('c'+abc[i]+'.').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // console.log(('c'+abc[i]+'. '), ('c'+abc[i]+'. ').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // console.log(('c'+abc[i]+':'), ('c'+abc[i]+':').match( /^[ivx][^:](?![ ]{3})|^[lcdm](?:[:]|[^:][ ]{3})|^[ivxlcdm]{2,}[^:](?![ ]{3})/i)); // } // a. i: v: x: aa. mm: else if($4.match( /^[a-z]+/i) ){var params = ' type="'+(letter.toLowerCase()==letter ? 'a':'A')+'" start="'+linum2int(letter)+'"';} else {var params = ' start="'+$4.replace(/\W/g, '')+'"';} } else {var params = '';} var marker = ( list_type == "ul" ? md_marker_ul : md_marker_ol ); list = list.replace( /\n{2,}/g, "\n\n\n" ); var result = _ProcessListItems( list, marker ); result = "<" + list_type + params +">\n" + result + ""; $1 = ( $1 ) ? $1 : ""; return $1 + "\n" + _HashBlock( result ) + "\n\n"; } ); text = text.replace( md_flag_DoLists_z, "" ) } return text; } var md_flag_ProcessListItems_z = "ae279c3e92b456b96f62b8cf03bbad88"; function _ProcessListItems( list_str, marker_any ) { md_list_level++; list_str = list_str.replace( /\n{2,}$/g, "\n" ); list_str += md_flag_ProcessListItems_z; var reg = new RegExp( '(\\n)?' + '(^[ \\t]*)' + '(' + marker_any + ')[ \\t]+' + '(([\\s\\S]+?)' + '(\\n{1,2}))' + '(?=\\n*(' + md_flag_ProcessListItems_z + '|\\2(' + marker_any + ')[ \\t]+))' , "gm" ); list_str = list_str.replace( reg, function ( $0, $1, $2, $3, $4 ) { var item = $4; if( $1 || item.match( /\n{2,}/ ) ) { item = _RunBlockGamut( _Outdent( item ) ); } else { item = _DoLists( _Outdent( item ) ); item = item.replace( /\n+$/, "" ); item = _RunSpanGamut( item ); } return "

  • " + item + "
  • \n"; } ); md_list_level--; return list_str.replace( md_flag_ProcessListItems_z, "" ); } var md_reg_DoDefLists = new RegExp( '(?:(\\n\\n)|^\\n?)' + '(' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '((\\S.*\\n)+)' + '\\n?' + '[ ]{0,' + md_less_than_tab + '}:[ ]+' + ')' + '(?:[\\s\\S]+?)' + '(' + '$' + '|' + '\\n{2,}' + '(?=\\S)' + '(?!' + '[ ]{0,' + md_less_than_tab + '}' + '(?:\\S.*\\n)+?' + '\\n?' + '[ ]{0,' + md_less_than_tab + '}:[ ]+' + ')' + '(?!' + '[ ]{0,' + md_less_than_tab + '}:[ ]+' + ')' + ')' + ')' , "g" ); function _DoDefLists( text ) { var reg = md_reg_DoDefLists; text = text.replace( reg, function( $0, $1, $2, $3, $4, $5 ) { var result = String_trim(_ProcessDefListItems($2)); result = "
    \n" + result + "\n
    "; if( !$1 ) $1 = ""; return $1 + _HashBlock( result ) + "\n\n"; } ); return text; } var md_reg_ProcessDefListItems1 = new RegExp( '(?:\\n\\n+|^\\n?)' + '(' + '[ ]{0,' + md_less_than_tab + '}' + '(?![:][ ]|[ ])' + '(?:\\S.*\\n)+?' + ')' + '(?=\\n?[ ]{0,3}:[ ])' , "g" ); var md_reg_ProcessDefListItems2 = new RegExp( '\\n(\\n+)?' + '[ ]{0,' + md_less_than_tab + '}' + '[:][ ]+' + '([\\s\\S]+?)' + '(?=\\n+' + '(?:' + '[ ]{0,' + md_less_than_tab + '}[:][ ]|
    |$' + ')' + ')' , "g" ); function _ProcessDefListItems( list_str ) { list_str = list_str.replace( /\n{2,}$/, "\n" ); var reg = md_reg_ProcessDefListItems1; list_str = list_str.replace( reg, function( $0, $1 ) { var terms = String_trim($1).split( /\n/ ); var text = ''; for( var i = 0, len = terms.length; i < len; i++ ) { var term = terms[i]; term = _RunSpanGamut( String_trim(term) ); text += "\n
    " + term + "
    "; } return text + "\n"; } ); var reg = md_reg_ProcessDefListItems2; list_str = list_str.replace( reg, function( $0, $1, $2 ) { var leading_line = $1; var def = $2; if ( leading_line || def.match( /\n{2,}/ ) ) { def = _RunBlockGamut( _Outdent( def + "\n\n" ) ); def = "\n" + def + "\n"; } else { def = String_rtrim(def); def = _RunSpanGamut( _Outdent( def ) ); } return "\n
    " + def + "
    \n"; } ); return list_str; } var md_flag_DoCodeBlocks_A = "36efa4d78857300a"; var md_flag_DoCodeBlocks_Z = "8eae6c6133167566"; var md_reg_DoCodeBlocks = new RegExp( '(?:\\n\\n|' + md_flag_DoCodeBlocks_A + ')' + '(' + '(?:' + '(?:[ ]{' + md_tab_width + '}|\\t)' + (pandoc ? '.*\\n+':'.*\\n+') + ')+' + ')' + '((?=^[ ]{0,' + md_tab_width + '}\\S)|' + md_flag_DoCodeBlocks_Z + ')' , "gm" ); function _DoCodeBlocks( text ) { text = md_flag_DoCodeBlocks_A + text + md_flag_DoCodeBlocks_Z; var reg = md_reg_DoCodeBlocks; text = text.replace( reg, _DoCodeBlocks_callback ); text = text .replace( md_flag_DoCodeBlocks_A, "" ) .replace( md_flag_DoCodeBlocks_Z, "" ) ; return text; } function _DoCodeBlocks_callback( $0, $1 ) { var codeblock = $1; codeblock = _EncodeCode( _Outdent( codeblock ) ); codeblock = codeblock.replace( /^\n+|\s+$/g, '' ); var result = "
    " + codeblock + "\n
    "; return "\n\n" + _HashBlock( result ) + "\n\n"; } var md_reg_DoCodeSpans = new RegExp( '(?:(?!\\\\)(^|[\\s\\S])?)' + '(`+)' + '([\\s\\S]+?(?!`)[\\s\\S])' + '\\2' + '(?!`)' , "g" ); function _DoCodeSpans( text ) { var reg = md_reg_DoCodeSpans; text = text.replace( reg, _DoCodeSpans_callback ); return text; } var md_reg_DoCodeSpans_callback = /^[ \t]*|[ \t]*$/g; function _DoCodeSpans_callback( $0, $1, $2, $3 ) { var c = $3; c = c.replace( md_reg_DoCodeSpans_callback, '' ); c = _EncodeCode( c ); return ($1 ? $1 : '') + "" + c + ""; } function _EncodeCode( str ) { str = str .replace( /&/g, '&' ) .replace( //g, '>' ); return _EscapeRegExpChars( str ); } var md_reg_DoItalicsAndBold_1 = new RegExp( ( pandoc || strict ? '(((?!__)([\\s\\S]{2}))?__)' + '(?=\\S)' + '(?!__)' + '(' + '(' + '[^_]+?' + '|' + '_(?=\\S)(?!_)([\\s\\S]+?)(?=\\S)[\\s\\S]_' + ')+?' + '(?=\\S)\\S)' + '__' : // Markdown Extra '(((?!\\w)([\\s\\S]))?__)' + '(?=\\S)' + '(?!__)' + '(' + '[\\s\\S]+?' + ')' + '__' + '(?!\\w)' ) , "g" ); var md_reg_DoItalicsAndBold_2 = new RegExp( '(((?!\\*\\*)([\\s\\S]{2}))?\\*\\*)' + '(?=\\S)' + '(?!\\*\\*)' + '(' + '(' + '[^\\*]+?' + '|' + '\\*(?=\\S)(?!\\*)([\\s\\S]+?)(?=\\S)[\\s\\S]\\*' + ')+?' + '(?=\\S)\\S)' + '\\*\\*' , "g" ); var md_reg_DoItalicsAndBold_3 = new RegExp( '(((?!\\w)[\\s\\S]|^)_)' + '(?=\\S)' + '(?!_)' + '(' + '[\\s\\S]+?' + ')' + '_' + '(?!\\w)' , "g" ); var md_reg_DoItalicsAndBold_4 = new RegExp( '(((?!\\*)[\\s\\S]|^)\\*)' + '(?=\\S)' + '(?!\\*)' + '(' + '[\\s\\S]+?' + ')' + '\\*' , "g" ); var md_reg_DoSuperscript = new RegExp( '(((?!\\^)[\\s\\S]|^)\\^)' + '(?=\\S)' + '(?!\\^)' + '(' + '([^\\\\](?![ ])|[\\\\][ ])+?' + ')' + '\\^' , "g" ); var md_reg_DoSubscript = new RegExp( '(((?!~)[\\s\\S]|^)~)' + '(?=\\S)' + '(?!~)' + '(' + '([^\\\\](?![ ])|[\\\\][ ])+?' + ')' + '~' , "g" ); var md_reg_DoItalicsAndBold_5 = /(?:___|\*\*\*)([\s\S]+?)(?:___|\*\*\*)/g; var md_reg_DoStrikethrough = /~~([\s\S]+?)~~/g; function _DoItalicsAndBold( text ) { var reg = md_reg_DoItalicsAndBold_5; text = text.replace( reg, (debug ? "$1" : "$1") ); var reg = md_reg_DoItalicsAndBold_1; text = text.replace( reg, (debug ? "$3$4" : "$3$4") ); var reg = md_reg_DoItalicsAndBold_2; text = text.replace( reg, (debug ? "$3$4" : "$3$4") ); var reg = md_reg_DoItalicsAndBold_3; text = text.replace( reg, (debug ? "$2$3" : "$2$3") ); var reg = md_reg_DoItalicsAndBold_4; text = text.replace( reg, (debug ? "$2$3" : "$2$3") ); var reg = md_reg_DoSuperscript; text = text.replace( reg, "$2$3" ); var reg = md_reg_DoSubscript; text = text.replace( reg, "$2$3" ); if(pandoc){ var reg = md_reg_DoStrikethrough; text = text.replace( reg, "$1" ); } return text; } var md_reg_DoBlockQuotes = new RegExp( '(' + (pandoc ? '.*\\n' : '') // match the line before the blockquote, a quasi "lookbehind" + '(' + '[ \\t]*>[ \\t]?' + '.+\\n' + '(.+\\n)*' + (pandoc && !strict ? '' : '\\n*') + ')' + (pandoc && !strict ? '' : '+') + ')' , "gm" ); function _DoBlockQuotes( text ) { var reg = md_reg_DoBlockQuotes; text = text.replace( reg, _DoBlockQuotes_callback ); return text; } var md_reg_DoBlockQuotes_callback_1 = /^[ \t]*>[ \t]?/gm; var md_reg_DoBlockQuotes_callback_2 = /^[ \t]+$/gm; var md_reg_DoBlockQuotes_callback_3 = /^/gm; var md_reg_DoBlockQuotes_callback_4 = /(\s*
    .+?<\/pre>)/;
        function _DoBlockQuotes_callback( $0, $1 ) {
        	if(pandoc && !strict && !$0.match(/^\n*[>]/)){
        		console.error('Pandoc doesn´t like blockquote inside a paragraph:');
        		console.log($0);
        		return $0;
        	}
            var bq = $1;
            bq = bq.replace( md_reg_DoBlockQuotes_callback_1, '' );
            bq = bq.replace( md_reg_DoBlockQuotes_callback_2, '' );
            bq = _RunBlockGamut( bq );
        
            bq = bq.replace( md_reg_DoBlockQuotes_callback_3, "  " );
            bq = bq.replace( md_reg_DoBlockQuotes_callback_4, _DoBlockQuotes_callback2 );
        
            return _HashBlock( "
    \n" + bq + "\n
    " ) + "\n\n"; } function _DoBlockQuotes_callback2( $0, $1 ) { var pre = $1; pre = pre.replace( /^[ ][ ]/gm, '' ); return pre; } function _FormParagraphs( text ) { text = text.replace( /^\n+|\n+$/g, "" ); var grafs = text.split( /\n{2,}/ ); for( var i = 0, len = grafs.length; i < len; i++ ) { var value = String_trim(_RunSpanGamut(grafs[i])); var clean_key = value; var block_key = value.substr( 0, 32 ); var is_p = ( md_html_blocks[block_key] == undefined && md_html_hashes[clean_key] == undefined ); if( is_p ) value = "

    " + value + "

    "; grafs[i] = value; } text = grafs.join( "\n\n" ); text = _UnhashTags( text ); return text; } function _EncodeAmpsAndAngles( text ) { return text .replace( /&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&' ) .replace( /<(?![a-z\/?\$!])/gi, "<" ) ; } function _EncodeAttribute(text) { // // Encode text for a double-quoted HTML attribute. This function // is *not* suitable for attributes enclosed in single quotes. text = _EncodeAmpsAndAngles(text); text = text.replace('"', '"'); return text; } var md_reg_esc_backslash = /\\\\/g; var md_reg_esc_backquote = /\\\`/g; var md_reg_esc_asterisk = /\\\*/g; var md_reg_esc_underscore= /\\\_/g; var md_reg_esc_lbrace = /\\\{/g; var md_reg_esc_rbrace = /\\\}/g; var md_reg_esc_lbracket = /\\\[/g; var md_reg_esc_rbracket = /\\\]/g; var md_reg_esc_lparen = /\\\(/g; var md_reg_esc_rparen = /\\\)/g; var md_reg_esc_hash = /\\\#/g; var md_reg_esc_period = /\\\./g; var md_reg_esc_exclamation = /\\\!/g; var md_reg_esc_colon = /\\\:/g; var md_reg_esc_bar = /\\\|/g; function _EncodeBackslashEscapes( text ) { return text .replace( md_reg_esc_backslash, "7f8137798425a7fed2b8c5703b70d078" ) .replace( md_reg_esc_backquote, "833344d5e1432da82ef02e1301477ce8" ) .replace( md_reg_esc_asterisk, "3389dae361af79b04c9c8e7057f60cc6" ) .replace( md_reg_esc_underscore, "b14a7b8059d9c055954c92674ce60032" ) .replace( md_reg_esc_lbrace, "f95b70fdc3088560732a5ac135644506" ) .replace( md_reg_esc_rbrace, "cbb184dd8e05c9709e5dcaedaa0495cf" ) .replace( md_reg_esc_lbracket, "815417267f76f6f460a4a61f9db75fdb" ) .replace( md_reg_esc_rbracket, "0fbd1776e1ad22c59a7080d35c7fd4db" ) .replace( md_reg_esc_lparen, "84c40473414caf2ed4a7b1283e48bbf4" ) .replace( md_reg_esc_rparen, "9371d7a2e3ae86a00aab4771e39d255d" ) .replace( md_reg_esc_hash, "01abfc750a0c942167651c40d088531d" ) .replace( md_reg_esc_period, "5058f1af8388633f609cadb75a75dc9d" ) .replace( md_reg_esc_exclamation, "9033e0e305f247c0c3c80d0c7848c8b3" ) .replace( md_reg_esc_colon, "853ae90f0351324bd73ea615e6487517" ) //.replace( md_reg_esc_bar, "eb486741c1df3f489d857e41773b1e87" ) ; } var md_reg_DoAutoLinks_1 = /<((https?|ftp):[^'">\s]+)>/gi; var md_reg_DoAutoLinks_2 = new RegExp( '<' + '(?:mailto:)?' + '(' + '[-.\\w]+' + '@' + '[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+' + ')' + '>' , "gi" ); function _DoAutoLinks( text ) { text = text.replace( md_reg_DoAutoLinks_1, '
    $1' ); var reg = md_reg_DoAutoLinks_2; text = text.replace( reg, function( $0, $1 ) { return _EncodeEmailAddress( _UnescapeSpecialChars( _UnslashQuotes( $1 ) ) ); } ); return text; } function _EncodeEmailAddress( addr ) { addr = "mailto:" + addr; var length = addr.length; addr = addr.replace( /([^:])/g, _EncodeEmailAddress_callback ); addr = '' + addr + ""; addr = addr.replace( /\">.+?:/g, '">' ); return addr; } function _EncodeEmailAddress_callback( $0, $1 ) { var str = $1; var r = Math.round( Math.random( ) * 100 ); if( r > 90 && str != '@' ) return str; else if( r < 45 ) return '&#x' + str.charCodeAt( 0 ).toString( 16 ) + ';'; else return '&#' + str.charCodeAt( 0 ) + ';'; } var md_reg_md5_backslash = /7f8137798425a7fed2b8c5703b70d078/g; var md_reg_md5_backquote = /833344d5e1432da82ef02e1301477ce8/g; var md_reg_md5_asterisk = /3389dae361af79b04c9c8e7057f60cc6/g; var md_reg_md5_underscore = /b14a7b8059d9c055954c92674ce60032/g; var md_reg_md5_lbrace = /f95b70fdc3088560732a5ac135644506/g; var md_reg_md5_rbrace = /cbb184dd8e05c9709e5dcaedaa0495cf/g; var md_reg_md5_lbracket = /815417267f76f6f460a4a61f9db75fdb/g; var md_reg_md5_rbracket = /0fbd1776e1ad22c59a7080d35c7fd4db/g; var md_reg_md5_lparen = /84c40473414caf2ed4a7b1283e48bbf4/g; var md_reg_md5_rparen = /9371d7a2e3ae86a00aab4771e39d255d/g; var md_reg_md5_hash = /01abfc750a0c942167651c40d088531d/g; var md_reg_md5_period = /5058f1af8388633f609cadb75a75dc9d/g; var md_reg_md5_exclamation = /9033e0e305f247c0c3c80d0c7848c8b3/g; var md_reg_md5_colon = /853ae90f0351324bd73ea615e6487517/g; var md_reg_md5_bar = /eb486741c1df3f489d857e41773b1e87/g; function _UnescapeSpecialChars( text ) { return text .replace( md_reg_md5_backslash, "\\" ) .replace( md_reg_md5_backquote, "`" ) .replace( md_reg_md5_asterisk, "*" ) .replace( md_reg_md5_underscore, "_" ) .replace( md_reg_md5_lbrace, "{" ) .replace( md_reg_md5_rbrace, "}" ) .replace( md_reg_md5_lbracket, "[" ) .replace( md_reg_md5_rbracket, "]" ) .replace( md_reg_md5_lparen, "(" ) .replace( md_reg_md5_rparen, ")" ) .replace( md_reg_md5_hash, "#" ) .replace( md_reg_md5_period, "." ) .replace( md_reg_md5_exclamation, "!" ) .replace( md_reg_md5_colon, ":" ) //.replace( md_reg_md5_bar, "|" ) ; } function _UnhashTags( text ) { for( var key in md_html_hashes ) { text = text.replace( new RegExp( key, "g" ), md_html_hashes[key] ); } return text; } function _TokenizeHTML( str ) { var index = 0; var tokens = new Array( ); var reg = new RegExp( '(?:)|' + '(?:<\\?[\\s\\S]*?\\?>)|' + '(?:<[/!$]?[-a-zA-Z0-9:]+\\b([^"\'>]+|"[^"]*"|\'[^\']*\')*>)' , "g" ); while( reg.test( str ) ) { var txt = RegExp.leftContext; var tag = RegExp.lastMatch; tokens.push( [ "text", txt ] ); tokens.push( [ "tag", tag ] ); str = str.replace( txt, "" ); str = str.replace( tag, "" ); } if( str != "" ) { tokens.push( [ "text", str ] ); } return tokens; } var md_reg_Outdent = new RegExp( '^(\\t|[ ]{1,' + md_tab_width + '})', "gm" ); function _Outdent( text ) { return text.replace( md_reg_Outdent, "" ); } function _Detab( text ) { text = text.replace( /(.*?)\t/g, function( match, substr ) { return substr += String_r(" ", (md_tab_width - substr.length % md_tab_width)); }); return text; } function _UnslashQuotes( text ) { return text.replace( '\"', '"' ); } var md_reg_backslash = /\\/g; var md_reg_backquote = /\`/g; var md_reg_asterisk = /\*/g; var md_reg_underscore= /\_/g; var md_reg_lbrace = /\{/g; var md_reg_rbrace = /\}/g; var md_reg_lbracket = /\[/g; var md_reg_rbracket = /\]/g; var md_reg_lparen = /\(/g; var md_reg_rparen = /\)/g; var md_reg_hash = /\#/g; var md_reg_period = /\./g; var md_reg_exclamation = /\!/g; var md_reg_colon = /\:/g; function _EscapeRegExpChars( text ) { return text .replace( md_reg_backslash, "7f8137798425a7fed2b8c5703b70d078" ) .replace( md_reg_backquote, "833344d5e1432da82ef02e1301477ce8" ) .replace( md_reg_asterisk, "3389dae361af79b04c9c8e7057f60cc6" ) .replace( md_reg_underscore, "b14a7b8059d9c055954c92674ce60032" ) .replace( md_reg_lbrace, "f95b70fdc3088560732a5ac135644506" ) .replace( md_reg_rbrace, "cbb184dd8e05c9709e5dcaedaa0495cf" ) .replace( md_reg_lbracket, "815417267f76f6f460a4a61f9db75fdb" ) .replace( md_reg_rbracket, "0fbd1776e1ad22c59a7080d35c7fd4db" ) .replace( md_reg_lparen, "84c40473414caf2ed4a7b1283e48bbf4" ) .replace( md_reg_rparen, "9371d7a2e3ae86a00aab4771e39d255d" ) .replace( md_reg_hash, "01abfc750a0c942167651c40d088531d" ) .replace( md_reg_period, "5058f1af8388633f609cadb75a75dc9d" ) .replace( md_reg_exclamation, "9033e0e305f247c0c3c80d0c7848c8b3" ) .replace( md_reg_colon, "853ae90f0351324bd73ea615e6487517" ) ; } function _EscapeItalicsAndBold( text ) { return text .replace( md_reg_asterisk, "3389dae361af79b04c9c8e7057f60cc6" ) .replace( md_reg_underscore, "b14a7b8059d9c055954c92674ce60032" ) ; } var md_md5cnt = 0; function _md5( ) { var key = "a3e597688f51d1fc" + ( md_md5cnt++ ) + "ce22217bb70243be"; return key; } /* Converter main flow */ return (function(text) { md_urls = new Object; md_titles = new Object; md_html_blocks = new Object; md_html_hashes = new Object; md_footnotes = new Object; md_footnotes_ordered = []; md_footnote_counter = 1; md_in_anchor = false; text = text.replace( /\r\n|\r/g, "\n" ); text += "\n\n"; text = _Detab( text ); text = _HashHTMLBlocks( text ); text = text.replace( /^[ \t]+$/gm, "" ); text = _StripFootnotes( text ); text = _StripLinkDefinitions( text ); text = _VerticalGlue( text ); text = _RunBlockGamut( text, false ); text = _AppendFootnotes( text ); text = _UnescapeSpecialChars( text ); return text + "\n"; }).call(this, text); }