Fork de wikipp, le moteur de wiki en c++, basé sur cppcms. Le fork ajoute la langue française
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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. }