summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/websetup.pm
blob: a30475977e2b07ef74d24666f3c8af6c3389bd09 (plain)
  1. #!/usr/bin/perl
  2. package IkiWiki::Plugin::websetup;
  3. use warnings;
  4. use strict;
  5. use IkiWiki 2.00;
  6. sub import { #{{{
  7. hook(type => "sessioncgi", id => "websetup",
  8. call => \&sessioncgi);
  9. hook(type => "formbuilder_setup", id => "websetup",
  10. call => \&formbuilder_setup);
  11. } # }}}
  12. sub addfields ($$@) {
  13. my $form=shift;
  14. my $section=shift;
  15. while (@_) {
  16. my $key=shift;
  17. my %info=%{shift()};
  18. next if ! $info{safe} || $info{type} eq "internal";
  19. my $description=exists $info{description_html} ? $info{description_html} : $info{description};
  20. my $value=$config{$key};
  21. # multiple plugins can have the same key
  22. my $name=$section.".".$key;
  23. if ($info{type} eq "string") {
  24. $form->field(
  25. name => $name,
  26. label => $description,
  27. comment => exists $info{example} && length $info{example} && $info{example} ne $value ? "<br/ ><small>Example: <tt>$info{example}</tt></small>" : "",
  28. type => "text",
  29. value => $value,
  30. size => 60,
  31. fieldset => $section,
  32. );
  33. }
  34. elsif ($info{type} eq "integer") {
  35. $form->field(
  36. name => $name,
  37. label => $description,
  38. type => "text",
  39. value => $value,
  40. validate => '/^[0-9]+$/',
  41. fieldset => $section,
  42. );
  43. }
  44. elsif ($info{type} eq "boolean") {
  45. $form->field(
  46. name => $name,
  47. label => "",
  48. type => "checkbox",
  49. value => $value,
  50. options => [ [ 1 => $description ] ],
  51. fieldset => $section,
  52. );
  53. }
  54. }
  55. }
  56. sub showform ($$) { #{{{
  57. my $cgi=shift;
  58. my $session=shift;
  59. if (! defined $session->param("name") ||
  60. ! IkiWiki::is_admin($session->param("name"))) {
  61. error(gettext("you are not logged in as an admin"));
  62. }
  63. eval q{use CGI::FormBuilder};
  64. error($@) if $@;
  65. my $form = CGI::FormBuilder->new(
  66. title => "setup",
  67. name => "setup",
  68. header => 0,
  69. charset => "utf-8",
  70. method => 'POST',
  71. javascript => 0,
  72. params => $cgi,
  73. action => $config{cgiurl},
  74. template => {type => 'div'},
  75. stylesheet => IkiWiki::baseurl()."style.css",
  76. );
  77. my $buttons=["Save Setup", "Cancel"];
  78. IkiWiki::decode_form_utf8($form);
  79. IkiWiki::run_hooks(formbuilder_setup => sub {
  80. shift->(form => $form, cgi => $cgi, session => $session,
  81. buttons => $buttons);
  82. });
  83. IkiWiki::decode_form_utf8($form);
  84. $form->field(name => "do", type => "hidden", value => "setup",
  85. force => 1);
  86. addfields($form, gettext("main"), IkiWiki::getsetup());
  87. require IkiWiki::Setup;
  88. foreach my $pair (IkiWiki::Setup::getsetup()) {
  89. my $plugin=$pair->[0];
  90. my $setup=$pair->[1];
  91. addfields($form, $plugin." ".gettext("plugin"), @{$setup});
  92. }
  93. if ($form->submitted eq "Cancel") {
  94. IkiWiki::redirect($cgi, $config{url});
  95. return;
  96. }
  97. elsif ($form->submitted eq 'Save Setup' && $form->validate) {
  98. # TODO
  99. $form->text(gettext("Setup saved."));
  100. }
  101. IkiWiki::showform($form, $buttons, $session, $cgi);
  102. } #}}}
  103. sub sessioncgi ($$) { #{{{
  104. my $cgi=shift;
  105. my $session=shift;
  106. if ($cgi->param("do") eq "setup") {
  107. showform($cgi, $session);
  108. exit;
  109. }
  110. } #}}}
  111. sub formbuilder_setup (@) { #{{{
  112. my %params=@_;
  113. my $form=$params{form};
  114. if ($form->title eq "preferences") {
  115. push @{$params{buttons}}, "Wiki Setup";
  116. if ($form->submitted && $form->submitted eq "Wiki Setup") {
  117. showform($params{cgi}, $params{session});
  118. exit;
  119. }
  120. }
  121. } #}}}
  122. 1