Fork de wikipp, le moteur de wiki en c++, basé sur cppcms. Le fork ajoute la langue française
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

master.cpp 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "wiki.h"
  2. #include "master.h"
  3. #include "master_content.h"
  4. #include "markdown.h"
  5. #include <cppcms/localization.h>
  6. #include <cppcms/service.h>
  7. #include <cppcms/xss.h>
  8. #define _(X) ::cppcms::locale::translate(X)
  9. #define N_(S,P,N) ::cppcms::locale::translate(S,P,N)
  10. namespace {
  11. cppcms::xss::rules const &xss_filter()
  12. {
  13. static cppcms::xss::rules r;
  14. static bool initialized = false;
  15. if(initialized)
  16. return r;
  17. using namespace cppcms::xss;
  18. r.html(rules::xhtml_input);
  19. r.add_tag("ol",rules::opening_and_closing);
  20. r.add_tag("ul",rules::opening_and_closing);
  21. r.add_tag("li",rules::opening_and_closing);
  22. r.add_tag("p",rules::opening_and_closing);
  23. r.add_property("p","style",booster::regex("\\s*text-align\\s*:\\s*(center|left|right)\\s*;?"));
  24. r.add_tag("b",rules::opening_and_closing);
  25. r.add_tag("i",rules::opening_and_closing);
  26. r.add_tag("tt",rules::opening_and_closing);
  27. r.add_tag("sub",rules::opening_and_closing);
  28. r.add_tag("sup",rules::opening_and_closing);
  29. r.add_tag("blockquote",rules::opening_and_closing);
  30. r.add_tag("strong",rules::opening_and_closing);
  31. r.add_tag("em",rules::opening_and_closing);
  32. r.add_tag("h1",rules::opening_and_closing);
  33. r.add_tag("h2",rules::opening_and_closing);
  34. r.add_tag("h3",rules::opening_and_closing);
  35. r.add_tag("h4",rules::opening_and_closing);
  36. r.add_tag("h5",rules::opening_and_closing);
  37. r.add_tag("h6",rules::opening_and_closing);
  38. booster::regex cl_id(".*");
  39. r.add_property("h1","id",cl_id);
  40. r.add_property("h2","id",cl_id);
  41. r.add_property("h3","id",cl_id);
  42. r.add_property("h4","id",cl_id);
  43. r.add_property("h5","id",cl_id);
  44. r.add_property("h6","id",cl_id);
  45. r.add_tag("span",rules::opening_and_closing);
  46. r.add_property("span","id",cl_id);
  47. r.add_tag("code",rules::opening_and_closing);
  48. r.add_tag("pre",rules::opening_and_closing);
  49. r.add_property("pre","name",booster::regex("\\w+"));
  50. r.add_property("pre","class",booster::regex("\\w+"));
  51. r.add_tag("a",rules::opening_and_closing);
  52. r.add_uri_property("a","href");
  53. r.add_tag("hr",rules::stand_alone);
  54. r.add_tag("br",rules::stand_alone);
  55. r.add_tag("img",rules::stand_alone);
  56. r.add_uri_property("img","src");
  57. r.add_integer_property("img","width");
  58. r.add_integer_property("img","height");
  59. r.add_integer_property("img","border");
  60. r.add_property("img","alt",booster::regex(".*"));
  61. r.add_tag("table",rules::opening_and_closing);
  62. r.add_tag("tr",rules::opening_and_closing);
  63. r.add_tag("th",rules::opening_and_closing);
  64. r.add_tag("td",rules::opening_and_closing);
  65. r.add_integer_property("table","cellpadding");
  66. r.add_integer_property("table","cellspacing");
  67. r.add_integer_property("table","border");
  68. r.add_tag("center",rules::opening_and_closing);
  69. r.add_entity("nbsp");
  70. r.encoding("UTF-8");
  71. r.comments_allowed(true);
  72. initialized = true;
  73. return r;
  74. }
  75. struct init_it { init_it() { xss_filter(); } } instance;
  76. }
  77. const int K_markdown_flags =
  78. 0x00000004| //MKD_NOPANTS
  79. 0x01000000| //MKD_DLEXTRA
  80. 0x02000000| //MKD_FENCEDCODE
  81. 0x08000000| //MKD_GITHUBTAGS
  82. 0x40000000| //MKD_LATEX
  83. 0;
  84. std::string mymarkdown(std::string const &s)
  85. {
  86. int flags = K_markdown_flags;
  87. if(s.compare(0,10,"<!--toc-->")==0) {
  88. flags |= mkd::toc;
  89. }
  90. std::string html = markdown_format_for_highlighting(markdown_to_html(s.c_str(),s.size(),flags),"cpp");
  91. return cppcms::xss::filter(html,xss_filter(),cppcms::xss::escape_invalid);
  92. }
  93. namespace apps {
  94. master::master(wiki &_w) :
  95. application(_w.service()),
  96. wi(_w),
  97. locale_name(wi.locale_name)
  98. {
  99. conn = wi.conn;
  100. cppcms::json::object langs=settings().get("wikipp.languages",cppcms::json::object());
  101. for(cppcms::json::object::const_iterator p=langs.begin(),e=langs.end();p!=e;++p) {
  102. std::string lname;
  103. if(p->first=="en")
  104. lname="English";
  105. else {
  106. /// Translate as the target language
  107. /// for fr gettext("LANG")="Francis"
  108. lname=_("LANG").str(service().generator().generate(p->second.str()));
  109. if(lname=="LANG") {
  110. lname=p->first;
  111. }
  112. }
  113. languages[lname]=settings().get<std::string>("wikipp.script") +"/"+ settings().get<std::string>("wikipp.language_default");
  114. }
  115. media=settings().get<std::string>("wikipp.media");
  116. syntax_highlighter=settings().get("wikipp.syntax_highlighter","");
  117. cookie_prefix=settings().get("session.cookies.prefix","cppcms_session")+"_";
  118. }
  119. void master::ini(content::master &c)
  120. {
  121. wi.options.load();
  122. c.markdown = mymarkdown;
  123. c.media=media;
  124. c.syntax_highlighter=syntax_highlighter;
  125. c.cookie_prefix=cookie_prefix;
  126. c.main_link=wi.page.default_page_url();
  127. c.main_local=wi.page.default_page_url(locale_name);
  128. c.toc=wi.index.index_url();
  129. c.changes=wi.index.changes_url();
  130. c.login_link=wi.users.login_url();
  131. c.wiki_title=wi.options.local.title;
  132. c.about=wi.options.local.about;
  133. c.copyright=wi.options.local.copyright;
  134. c.contact=wi.options.global.contact;
  135. c.edit_options=wi.options.edit_url();
  136. c.languages=languages;
  137. }
  138. }