sq_markdown.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include "squirrel.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include "sqstdblobimpl.h"
  5. extern "C" {
  6. #include "render_html.h"
  7. }
  8. static void mywrite(const MD_CHAR *s,MD_SIZE len,void *blob)
  9. {
  10. SQBlob *b= (SQBlob*)blob;
  11. b->Write(s,len);
  12. }
  13. static SQRESULT sq_markdown2html(HSQUIRRELVM v)
  14. {
  15. SQ_FUNC_VARS(v);
  16. SQ_GET_STRING(v, 2, str);
  17. SQ_OPT_INTEGER(v, 3, len, str_size);
  18. SQ_OPT_INTEGER(v, 4, parser_flags, MD_DIALECT_GITHUB | MD_FLAG_PERMISSIVEATXHEADERS);
  19. SQ_OPT_INTEGER(v, 5, renderer_flags, 0);
  20. if(len > str_size || len < 0) return sq_throwerror(v, _SC("invalid parameter value (%d)"), len);
  21. /* Input size is good estimation of output size. Add some more reserve to
  22. * deal with the HTML header/footer and tags. */
  23. SQBlob b(0, len + (len/8 + 64));
  24. int ret = md_render_html((const MD_CHAR*)str, len, mywrite,
  25. (void*) &b, parser_flags, renderer_flags);
  26. if(ret != 0) return sq_throwerror(v, _SC("markdown2html parsing failed"));
  27. sq_pushstring(v, (SQChar*)b.GetBuf(), b.Len());
  28. return 1;
  29. }
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33. SQRESULT sqext_register_markdown(HSQUIRRELVM v)
  34. {
  35. sq_insertfunc(v, _SC("markdown2html"), sq_markdown2html, -2, _SC(".siii"), SQTrue);
  36. sq_pushconsttable(v);
  37. #define INT_CONST(num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  38. INT_CONST(MD_FLAG_COLLAPSEWHITESPACE);
  39. INT_CONST(MD_FLAG_PERMISSIVEATXHEADERS);
  40. INT_CONST(MD_FLAG_PERMISSIVEURLAUTOLINKS);
  41. INT_CONST(MD_FLAG_PERMISSIVEEMAILAUTOLINKS);
  42. INT_CONST(MD_FLAG_NOINDENTEDCODEBLOCKS);
  43. INT_CONST(MD_FLAG_NOHTMLBLOCKS);
  44. INT_CONST(MD_FLAG_NOHTMLSPANS);
  45. INT_CONST(MD_FLAG_TABLES);
  46. INT_CONST(MD_FLAG_STRIKETHROUGH);
  47. INT_CONST(MD_FLAG_PERMISSIVEWWWAUTOLINKS);
  48. INT_CONST(MD_FLAG_PERMISSIVEAUTOLINKS);
  49. INT_CONST(MD_FLAG_NOHTML);
  50. INT_CONST(MD_DIALECT_COMMONMARK);
  51. INT_CONST(MD_DIALECT_GITHUB);
  52. INT_CONST(MD_RENDER_FLAG_DEBUG);
  53. INT_CONST(MD_RENDER_FLAG_VERBATIM_ENTITIES);
  54. sq_poptop(v); //remove const table
  55. return 0;
  56. }
  57. #ifdef __cplusplus
  58. }
  59. #endif