DokuWiki

It's better when it's simple

Инструменты пользователя

Инструменты сайта


ru:plugin:spoiler

Это старая версия документа!


Плагин Spoiler

Совместим с «Докувики»

2007-06-26+,​ Lemming, Anteater, Rincewind, Angua, Adora Belle, Weatherwax, Binky, Ponder Stibbons

plugin Добавление спойлерных секций

Последнее обновление:
2007-07-19
Предоставляет
Syntax

Это расширение не обновлялось более двух лет. Возможно, оно больше не разрабатывается или не поддерживается; возможны проблемы совместимости.

This extension is not in the 'plugin' or 'template' namespace and is therefore ignored.

Похож на folded, stepbystep, togglewrap, wrap

Теги: hide

Спойлер-тег для DokuWiki. Создаёт секцию текста, спрятанную под кнопкой (можно задать название) и появляющуюся/прячущуюся по клику на кнопке.

Синтаксис

<spoiler>Содержимое в спойлере с названием по умолчанию</spoiler>
<spoiler|Название>Содержимое в спойлере с заданным названием</spoiler>
<spoiler>
Этот спойлер содержит вложенный спойлер
<spoiler>8-o</spoiler>
</spoiler>

Создать кнопку для этого кода можно с помощью плагина plugin:custombuttons.

На сайте автора можно посмотреть примеры, потренироваться в Песочнице и скачать последнюю версию плагина.

Обсуждение

Хотелось бы видеть его работающим со списками:

    <spoiler>
    * Foo
    * Bar
    </spoiler>

Это было бы замечательное дополнение к замечательному плагину.

Да, с последними версиями Dokuwiki не работает. Возможно, автор не нашёл решения с 2007 года…


Патч для контроля состояния всех спойлер-тегов на странице

Синтаксис:

%%~~SPOILER:open|Название~~%%
%%~~SPOILER:close|Название~~%%
%%~~SPOILER:hide|Название~~%%
%%~~SPOILER~~%%

По умолчанию open, открывающий все спойлеры, this is opposite of using <spoiler> without ~~SPOILER~~.

Режимы:

  • open : При загрузке страницы все спойлеры открыты
  • close: При загрузке страницы все спойлеры закрыты
  • hide : При загрузке страницы все спойлеры скрыты совсем

Ниже описание изменений в style.css и syntax.php:

*** ./style.css Wed Jul 18 14:14:43 2007
--- ./new_style.css     Tue Nov 17 15:43:41 2009
***************
*** 24,26 ****
--- 24,47 ----
        margin-top: 0.5em;
  }
 
+ .spoilerctrl {
+       margin-top: 0.5em;
+       margin-bottom: 1em;
+ }
+
+ .spoilerctrl .title {
+       /* font-size: 110%; */
+       font-size: 90%;
+       font-weight: bold;
+       display: block;
+       float: left;
+ }
+
+ .spoilerctrl .title:after {
+       content: ': ';
+ }
+
+
+ .spoilerctrl input {
+       font-size: 70%;
+ }
*** ./syntax.php        Thu Jul 19 15:32:57 2007
--- ./new_syntax.php    Tue Nov 17 15:43:41 2009
***************
*** 56,61 ****
--- 56,62 ----
        function connectTo($mode) {
                // Lookahead assertion: check that there is an end tag.
                $this->Lexer->addEntryPattern('<spoiler[^>\r\n]*?>(?=.*?</spoiler>)', $mode, 'plugin_spoiler');
+               $this->Lexer->addSpecialPattern('~~SPOILER[^~\r\n]*?~~', $mode, 'plugin_spoiler');
        }
 
        function postConnect() {
***************
*** 73,88 ****
                                        $title = substr($options, strpos($options, '|') + 1);
                                }
 
!                               return array($state, $title);
                                break;
                        case DOKU_LEXER_MATCHED :
                                break;
                        case DOKU_LEXER_UNMATCHED :
!                               return array($state, $match);
                                break;
                        case DOKU_LEXER_EXIT :
                                break;
                        case DOKU_LEXER_SPECIAL :
                                break;
                }
                return array($state);
--- 74,108 ----
                                        $title = substr($options, strpos($options, '|') + 1);
                                }
 
!                               return array($state, $title, '');
                                break;
                        case DOKU_LEXER_MATCHED :
                                break;
                        case DOKU_LEXER_UNMATCHED :
!                               return array($state, $match, '');
                                break;
                        case DOKU_LEXER_EXIT :
                                break;
                        case DOKU_LEXER_SPECIAL :
+                               // "~~SPOILER" options "~~"
+                               $options = substr($match, 8, -2);
+
+                                 $endPos = strlen($options) + 1;
+                               if (strpos($options, '|') !== False) {
+                                         $endPos = strpos($options,'|');
+                                       $title = substr($options, $endPos + 1);
+                               }
+
+                                 $switch = 'show';
+                                 $options = substr($options,1,$endPos - 1);
+                               if (strpos($options, ':') !== False) {
+                                         $startPos = strpos($options,':');
+                                       $switch = substr($options, $startPos + 1, $endPos - ($startPos + 1));
+                               }
+
+                                 if ($title == '') $title = 'Spoiler Control';
+
+                               return array($state, $title, $switch);
                                break;
                }
                return array($state);
***************
*** 90,96 ****
 
        function render($mode, &$renderer, $data) {
                if($mode == 'xhtml'){
!                       list($state, $payload) = $data;
 
                        switch ($state) {
                                case DOKU_LEXER_ENTER :
--- 110,116 ----
 
        function render($mode, &$renderer, $data) {
                if($mode == 'xhtml'){
!                       list($state, $payload, $switch) = $data;
 
                        switch ($state) {
                                case DOKU_LEXER_ENTER :
***************
*** 100,105 ****
--- 120,139 ----
                                        break;
                                case DOKU_LEXER_MATCHED :
                                        break;
+                               case DOKU_LEXER_SPECIAL :
+                                       $script = "if (this.value == 'Show All') { spoilerControl(1); this.value = 'Hide All' } else { spoilerControl(0); this.value = 'Show All' }";
+                                         switch($switch){
+                                             case 'close':
+                                               $renderer->doc .= '<div class="spoilerctrl"><div class="title">'. $payload .'</div><input type="button" value="Show All" onClick="'. $script .'" /></div><script type="text/javascript">spoilerControl(0);</script>';
+                                                 break;
+                                             case 'hide':
+                                               $renderer->doc .= '<script type="text/javascript">spoilerControl(0);</script>';
+                                                 break;
+                                             default:
+                                               $renderer->doc .= '<div class="spoilerctrl"><div class="title">'. $payload .'</div><input type="button" value="Hide All" onClick="'. $script .'" /></div>';
+                                                 break;
+                                         }
+                                       break;
                                case DOKU_LEXER_UNMATCHED :
                                        $renderer->doc .= $renderer->_xmlEntities($payload);
                                        break;

Also, add the file script.js:

function spoilerControl(state) {
    var el = document.getElementsByTagName('DIV');
    for(var j=0; j < el.length; j++) {
    var className = el[j].className;
    if (className == "spoiler") {
        if (state == 1) {
            el[j].style.display = '';
        }else {
            el[j].style.display = 'none';
        }
    }
    }
}

Этот файл скрывает спойлеры при печати (назовите print.css):

div.dokuwiki .spoiler {
    visibility: hidden;
    display: none;
}
div.dokuwiki .spoilerctrl {
    visibility: hidden;
    display: none;
}

– Chris Usher 2009-11-17


Проблемы

  • Спойлер не работает с таблицей
  • Проблема с апострофом ' в имени спойлера
    • Поставьте строку $payload = str_replace(«'»,«’»,$payload); после строки list($state, $payload) = $data;
ru/plugin/spoiler.1429729719.txt.gz · Последнее изменение: 2015-04-22 21:08 — 37.200.79.19

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki