среда, 25 мая 2011 г.

Спойлеры (spoilers) в doxygen-тексте

Нужно было добавить спойлеры в doxygen-описание, так, чтобы второстепенные подробности не загромождали основной текст.
Было очевидно, что лезть надо в html.
За вставку html-текста в doxygen отвечают скобки из команд \htmlonly \endhtmlonly. Между ними можно вставить html-скрипт спойлера, а затем заключить нужный текст в специфичные теги.


Нагуглил такой вариант скрипта:
<script type="text/javascript">
<!--

// настройки

var collapse_section_id = "quotes"; // ID раздела с элементами
var title_tag = "H3"; // имя тега для заголовков
var item_tag = "BLOCKQUOTE"; // имя тега для текста
var text_decotation = "underline" // подчеркивание заголовков, если не нужно -- ставим "none"
var highlight_text = "« "; // загогулина перед заголовком при открытом тексте (нельзя использовать entities!)
var normal_text = "» "; // загогулина перед заголовком при скрытом тексте (нельзя использовать entities!)

// главная ф-ция

function toggle(e){
    var el = window.event ? window.event.srcElement : e.currentTarget;
    var collapse_item = el.nextSibling;
    while (collapse_item.nodeType != 1) collapse_item = collapse_item.nextSibling; // workaround (whitespace)!
    curr_shown = collapse_item.style.display == "block";
    collapse_item.style.display = (curr_shown) ? "none" : "block";
    var title_text = el.firstChild;
    title_text.nodeValue = (curr_shown) ? title_text.nodeValue.replace(highlight_text, normal_text) : title_text.nodeValue.replace(normal_text, highlight_text);
}

// ф-ция инициализации

function init(){
    if (document.getElementById && document.createTextNode){
        var collapse_section = document.getElementById(collapse_section_id);
        var collapse_title = collapse_item = null;
        for (var i = 0; ((collapse_title = collapse_section.getElementsByTagName(title_tag).item(i)) && (collapse_item = collapse_section.getElementsByTagName(item_tag).item(i))); i++){
            collapse_title.style.textDecoration = text_decotation;
            collapse_title.style.cursor = window.event ? "hand" : "pointer";
            if (collapse_title.addEventListener) collapse_title.addEventListener("click", toggle, false);
            else if (collapse_title.attachEvent) collapse_title.attachEvent("onclick", toggle);
            collapse_title.firstChild.nodeValue = normal_text + collapse_title.firstChild.nodeValue;
            collapse_item.style.display = "none";
        }
    }
}

// запускаем процесс по onload'у

var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
if (root){
    if (root.addEventListener) root.addEventListener("load", init, false);
    else if (root.attachEvent) root.attachEvent("onload", init);
}
//-->
</script>

 и его использование:
<div id="quotes" class="example">
<h3 style="color: #1b4f88">Аристотель</h3>
<blockquote>Разумный гонится не за тем, что приятно, а за тем, что избавляет от неприятностей.</blockquote>
<h3 style="color: #1b4f88">Ж. Ж. Руссо</h3>
<blockquote>Чтобы написать любовное письмо, нужно начинать, не зная, что собираешься сказать, и заканчивать, не зная, о чём написал.</blockquote>

Скрипт <script> ... </script> и служебные теги <div ... > <h3 ... > <blockquote> вставляются между \htmlonly \endhtmlonly .

В итоге набросал такую схему:
/**
\htmlonly
<script type="text/javascript">
<!--

// настройки

var collapse_section_id = "quotes"; // ID раздела с элементами
var title_tag = "H3"; // имя тега для заголовков
var item_tag = "BLOCKQUOTE"; // имя тега для текста
var text_decotation = "underline" // подчеркивание заголовков, если не нужно -- ставим "none"
var highlight_text = "« "; // загогулина перед заголовком при открытом тексте (нельзя использовать entities!)
var normal_text = "» "; // загогулина перед заголовком при скрытом тексте (нельзя использовать entities!)

// главная ф-ция

function toggle(e){
    var el = window.event ? window.event.srcElement : e.currentTarget;
    var collapse_item = el.nextSibling;
    while (collapse_item.nodeType != 1) collapse_item = collapse_item.nextSibling; // workaround (whitespace)!
    curr_shown = collapse_item.style.display == "block";
    collapse_item.style.display = (curr_shown) ? "none" : "block";
    var title_text = el.firstChild;
    title_text.nodeValue = (curr_shown) ? title_text.nodeValue.replace(highlight_text, normal_text) : title_text.nodeValue.replace(normal_text, highlight_text);
}

// ф-ция инициализации

function init(){
    if (document.getElementById && document.createTextNode){
        var collapse_section = document.getElementById(collapse_section_id);
        var collapse_title = collapse_item = null;
        for (var i = 0; ((collapse_title = collapse_section.getElementsByTagName(title_tag).item(i)) && (collapse_item = collapse_section.getElementsByTagName(item_tag).item(i))); i++){
            collapse_title.style.textDecoration = text_decotation;
            collapse_title.style.cursor = window.event ? "hand" : "pointer";
            if (collapse_title.addEventListener) collapse_title.addEventListener("click", toggle, false);
            else if (collapse_title.attachEvent) collapse_title.attachEvent("onclick", toggle);
            collapse_title.firstChild.nodeValue = normal_text + collapse_title.firstChild.nodeValue;
            collapse_item.style.display = "none";
        }
    }
}

// запускаем процесс по onload'у

var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null;
if (root){
    if (root.addEventListener) root.addEventListener("load", init, false);
    else if (root.attachEvent) root.attachEvent("onload", init);
}
//-->
</script>
\endhtmlonly

@page something_desc О чём-то
@section what_is_something Что такое что-то
Достоверно известно, что "где-то кто-то для кого-то из чего-то сделал что-то". Что-то -- материально :).

\htmlonly <div id='quotes' class='spoiler_for_something'>
<H3>Подробнее</H3>
<BLOCKQUOTE>
\endhtmlonly
И здесь какой-нибудь окончательно задуривающий код:
\code
                if(  )
                {
                    ;
                }
\endcode
\htmlonly
</BLOCKQUOTE>
</div>
\endhtmlonly


@section links Ссылки

*/

Результатом доволен )

P.S. блог пишу впервые, буду рад, если кто из знающих подскажет, как этот самый "результат" в виде html здесь разместить.


Комментариев нет: