Fork de wikipp, le moteur de wiki en c++, basé sur cppcms. Le fork ajoute la langue française
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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