Просмотр исходного кода

Now using md4c as main markdown parser

mingodad 8 лет назад
Родитель
Сommit
13399f7717
2 измененных файлов с 104 добавлено и 36 удалено
  1. 29 36
      SquiLu-ext/sq_markdown.cpp
  2. 75 0
      SquiLu-ext/sq_md_discount.cpp

+ 29 - 36
SquiLu-ext/sq_markdown.cpp

@@ -3,11 +3,11 @@
 #include <string.h>
 #include <stdio.h>
 #include "sqstdblobimpl.h"
-extern "C" {
-#include "markdown.h"
+extern "C" {
+#include "render_html.h"
 }
 
-static void mywrite(char const *s,int len,void *blob)
+static void mywrite(const MD_CHAR *s,MD_SIZE len,void *blob)
 {
 	SQBlob *b= (SQBlob*)blob;
 	b->Write(s,len);
@@ -18,10 +18,15 @@ static SQRESULT sq_markdown2html(HSQUIRRELVM v)
     SQ_FUNC_VARS(v);
     SQ_GET_STRING(v, 2, str);
     SQ_OPT_INTEGER(v, 3, len, str_size);
-    SQ_OPT_INTEGER(v, 4, flags, 0);
+    SQ_OPT_INTEGER(v, 4, parser_flags, MD_DIALECT_GITHUB | MD_FLAG_PERMISSIVEATXHEADERS);
+    SQ_OPT_INTEGER(v, 5, renderer_flags, 0);
     if(len > str_size || len < 0) return sq_throwerror(v, _SC("invalid parameter value (%d)"), len);
-    SQBlob b(0, 8192);
-    markdown_str(mkd_string(str, len, 0), &b ,mywrite, flags);
+    /* Input size is good estimation of output size. Add some more reserve to
+     * deal with the HTML header/footer and tags. */
+    SQBlob b(0, len + (len/8 + 64));
+    int ret = md_render_html((const MD_CHAR*)str, len, mywrite,
+                (void*) &b, parser_flags, renderer_flags);
+    if(ret != 0) return sq_throwerror(v, _SC("markdown2html parsing failed"));
     sq_pushstring(v, (SQChar*)b.GetBuf(), b.Len());
     return 1;
 }
@@ -33,38 +38,26 @@ extern "C" {
 
 SQRESULT sqext_register_markdown(HSQUIRRELVM v)
 {
-    sq_insertfunc(v, _SC("markdown2html"), sq_markdown2html, -2, _SC(".sii"), SQTrue);
+    sq_insertfunc(v, _SC("markdown2html"), sq_markdown2html, -2, _SC(".siii"), SQTrue);
     sq_pushconsttable(v);
 #define INT_CONST(num) 	sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
-    INT_CONST(MKD_NOLINKS);
-    INT_CONST(MKD_NOIMAGE);
-    INT_CONST(MKD_NOPANTS);
-    INT_CONST(MKD_NOHTML);
-    INT_CONST(MKD_STRICT);
-    INT_CONST(MKD_TAGTEXT);
-    INT_CONST(MKD_NO_EXT);
-    INT_CONST(MKD_CDATA);
-    INT_CONST(MKD_NOSUPERSCRIPT);
-    INT_CONST(MKD_NORELAXED);
-    INT_CONST(MKD_NOTABLES);
-    INT_CONST(MKD_NOSTRIKETHROUGH);
-    INT_CONST(MKD_TOC);
-    INT_CONST(MKD_1_COMPAT);
-    INT_CONST(MKD_AUTOLINK);
-    INT_CONST(MKD_SAFELINK);
-    INT_CONST(MKD_NOHEADER);
-    INT_CONST(MKD_TABSTOP);
-    INT_CONST(MKD_NODIVQUOTE);
-    INT_CONST(MKD_NOALPHALIST);
-    INT_CONST(MKD_NODLIST);
-    INT_CONST(MKD_EXTRA_FOOTNOTE);
-    INT_CONST(MKD_NOSTYLE);
-    INT_CONST(MKD_NODLDISCOUNT);
-    INT_CONST(MKD_DLEXTRA);
-    INT_CONST(MKD_FENCEDCODE);
-    INT_CONST(MKD_IDANCHOR);
-    INT_CONST(MKD_GITHUBTAGS);
-    INT_CONST(MKD_URLENCODEDANCHOR);
+    INT_CONST(MD_FLAG_COLLAPSEWHITESPACE);
+    INT_CONST(MD_FLAG_PERMISSIVEATXHEADERS);
+    INT_CONST(MD_FLAG_PERMISSIVEURLAUTOLINKS);
+    INT_CONST(MD_FLAG_PERMISSIVEEMAILAUTOLINKS);
+    INT_CONST(MD_FLAG_NOINDENTEDCODEBLOCKS);
+    INT_CONST(MD_FLAG_NOHTMLBLOCKS);
+    INT_CONST(MD_FLAG_NOHTMLSPANS);
+    INT_CONST(MD_FLAG_TABLES);
+    INT_CONST(MD_FLAG_STRIKETHROUGH);
+    INT_CONST(MD_FLAG_PERMISSIVEWWWAUTOLINKS);
+    INT_CONST(MD_FLAG_PERMISSIVEAUTOLINKS);
+    INT_CONST(MD_FLAG_NOHTML);
+    INT_CONST(MD_DIALECT_COMMONMARK);
+    INT_CONST(MD_DIALECT_GITHUB);
+
+    INT_CONST(MD_RENDER_FLAG_DEBUG);
+    INT_CONST(MD_RENDER_FLAG_VERBATIM_ENTITIES);
 
     sq_poptop(v); //remove const table
     return 0;

+ 75 - 0
SquiLu-ext/sq_md_discount.cpp

@@ -0,0 +1,75 @@
+
+#include "squirrel.h"
+#include <string.h>
+#include <stdio.h>
+#include "sqstdblobimpl.h"
+extern "C" {
+#include "markdown.h"
+}
+
+static void mywrite(char const *s,int len,void *blob)
+{
+	SQBlob *b= (SQBlob*)blob;
+	b->Write(s,len);
+}
+
+static SQRESULT sq_markdown2html(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SQ_GET_STRING(v, 2, str);
+    SQ_OPT_INTEGER(v, 3, len, str_size);
+    SQ_OPT_INTEGER(v, 4, flags, 0);
+    if(len > str_size || len < 0) return sq_throwerror(v, _SC("invalid parameter value (%d)"), len);
+    SQBlob b(0, 8192);
+    markdown_str(mkd_string(str, len, 0), &b ,mywrite, flags);
+    sq_pushstring(v, (SQChar*)b.GetBuf(), b.Len());
+    return 1;
+}
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SQRESULT sqext_register_markdown(HSQUIRRELVM v)
+{
+    sq_insertfunc(v, _SC("markdown2html"), sq_markdown2html, -2, _SC(".sii"), SQTrue);
+    sq_pushconsttable(v);
+#define INT_CONST(num) 	sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
+    INT_CONST(MKD_NOLINKS);
+    INT_CONST(MKD_NOIMAGE);
+    INT_CONST(MKD_NOPANTS);
+    INT_CONST(MKD_NOHTML);
+    INT_CONST(MKD_STRICT);
+    INT_CONST(MKD_TAGTEXT);
+    INT_CONST(MKD_NO_EXT);
+    INT_CONST(MKD_CDATA);
+    INT_CONST(MKD_NOSUPERSCRIPT);
+    INT_CONST(MKD_NORELAXED);
+    INT_CONST(MKD_NOTABLES);
+    INT_CONST(MKD_NOSTRIKETHROUGH);
+    INT_CONST(MKD_TOC);
+    INT_CONST(MKD_1_COMPAT);
+    INT_CONST(MKD_AUTOLINK);
+    INT_CONST(MKD_SAFELINK);
+    INT_CONST(MKD_NOHEADER);
+    INT_CONST(MKD_TABSTOP);
+    INT_CONST(MKD_NODIVQUOTE);
+    INT_CONST(MKD_NOALPHALIST);
+    INT_CONST(MKD_NODLIST);
+    INT_CONST(MKD_EXTRA_FOOTNOTE);
+    INT_CONST(MKD_NOSTYLE);
+    INT_CONST(MKD_NODLDISCOUNT);
+    INT_CONST(MKD_DLEXTRA);
+    INT_CONST(MKD_FENCEDCODE);
+    INT_CONST(MKD_IDANCHOR);
+    INT_CONST(MKD_GITHUBTAGS);
+    INT_CONST(MKD_URLENCODEDANCHOR);
+
+    sq_poptop(v); //remove const table
+    return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif