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.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. std::string mymarkdown(std::string const &s)
  78. {
  79. int flags = mkd::no_pants;
  80. if(s.compare(0,10,"<!--toc-->")==0) {
  81. flags |= mkd::toc;
  82. }
  83. std::string html = markdown_format_for_highlighting(markdown_to_html(s.c_str(),s.size(),flags),"cpp");
  84. return cppcms::xss::filter(html,xss_filter(),cppcms::xss::escape_invalid);
  85. }
  86. namespace apps {
  87. master::master(wiki &_w) :
  88. application(_w.service()),
  89. wi(_w),
  90. locale_name(wi.locale_name)
  91. {
  92. conn = wi.conn;
  93. cppcms::json::object langs=settings().get("wikipp.languages",cppcms::json::object());
  94. for(cppcms::json::object::const_iterator p=langs.begin(),e=langs.end();p!=e;++p) {
  95. std::string lname;
  96. if(p->first=="en")
  97. lname="English";
  98. else {
  99. /// Translate as the target language
  100. /// for fr gettext("LANG")="Francis"
  101. lname=_("LANG").str(service().generator().generate(p->second.str()));
  102. if(lname=="LANG") {
  103. lname=p->first;
  104. }
  105. }
  106. languages[lname]=settings().get<std::string>("wikipp.script") +"/"+ p->first.str();
  107. }
  108. media=settings().get<std::string>("wikipp.media");
  109. syntax_highlighter=settings().get("wikipp.syntax_highlighter","");
  110. cookie_prefix=settings().get("session.cookies.prefix","cppcms_session")+"_";
  111. }
  112. void master::ini(content::master &c)
  113. {
  114. wi.options.load();
  115. c.markdown = mymarkdown;
  116. c.media=media;
  117. c.syntax_highlighter=syntax_highlighter;
  118. c.cookie_prefix=cookie_prefix;
  119. c.main_link=wi.page.default_page_url();
  120. c.main_local=wi.page.default_page_url(locale_name);
  121. c.toc=wi.index.index_url();
  122. c.changes=wi.index.changes_url();
  123. c.login_link=wi.users.login_url();
  124. c.wiki_title=wi.options.local.title;
  125. c.about=wi.options.local.about;
  126. c.copyright=wi.options.local.copyright;
  127. c.contact=wi.options.global.contact;
  128. c.edit_options=wi.options.edit_url();
  129. c.languages=languages;
  130. }
  131. }