Как создать сворачиваемые разделы кода в стиле rdoc?

Я создаю внутреннюю документацию для проекта C++, используя Doxygen. Я заставляю Doxygen включать исходный код для методов и т. д., но это затрудняет сканирование страницы. Я бы хотел, чтобы он вел себя как rdoc и скрывал исходный код в свернутом по умолчанию блоке.

Я думал, что HTML_DYNAMIC_SECTIONS может позволить мне это сделать, но, увы, в журнале изменений написано, что эта опция влияет только на диаграммы и графики.

Может быть, я мог бы сделать это, отредактировав LAYOUT_FILE?

В любом случае, умные люди, как я могу заставить Doxygen генерировать сворачиваемые разделы кода?


person Matthew Lowe    schedule 21.10.2009    source источник


Ответы (2)


если включение[включение] исходного кода для методов и т. д. [...] затрудняет сканирование страницы, почему бы вам просто не связать с ней ( SOURCE_BROWSER = YES) вместо включения (INLINE_SOURCES = YES)? это упростит сканирование страниц и ускорит их загрузку, а исходный код будет по-прежнему доступен (за счет загрузки еще одной исходной страницы). зависит от того, как часто вам действительно нужно обращаться к источнику, я думаю.

при этом существует способ создания сворачиваемых разделов кода (однако вам придется изменить исходный код и перекомпилировать Doxygen):

  • сворачиваемые разделы в HTML-выводе Doxygen отмечены двумя вложенными <div>s следующим образом:
    <div class="dynheader"><div class="dynsection">
    [collapsible section]
    </div></div>

реализация (или путь SOURCE_BROWSER :)) оставлена ​​в качестве упражнения для читателя. удачи!

о, и если у вас получится с патчем, было бы здорово, если бы вы могли отправить его Дмитрию, чтобы он мог включить его в будущую версию. Благодарность!

person ax.    schedule 24.10.2009
comment
› почему бы вам просто не указать ссылку (SOURCE_BROWSER = YES) вместо включения (INLINE_SOURCES = YES)? Думаю, потому что мне нравится, как работает rdoc. Отчасти я думаю, что это потому, что с INLINE_SOURCES вам все равно придется прокручивать до определения функции. › вам придется изменить исходный код и перекомпилировать Doxygen, поэтому я полагаю, что ответ таков: нет, doxygen не может этого сделать, если вы не напишете его самостоятельно. Достаточно хорошо. И спасибо за действительно подробные инструкции о том, как добавить его самому ... если я сделаю эту модификацию, я обязательно ее отправлю. - person Matthew Lowe; 26.10.2009

Придя сюда, используя поисковую систему по моему выбору, я просто хочу оставить здесь примечание, что нет абсолютной необходимости изменять какой-либо источник doxygen.

Когда был задан этот вопрос, вероятно, не было возможности встроить чистый html с помощью тега htmlonly, но с учетом этого можно создавать складные разделы-контейнеры, злоупотребляя функцией с именем toggleVisibility

 function toggleVisibility(linkObj)
 {
   var base = $(linkObj).attr('id');
   var summary = $('#'+base+'-summary');
   var content = $('#'+base+'-content');
   var trigger = $('#'+base+'-trigger');
   var src=$(trigger).attr('src');
   if (content.is(':visible')===true) {
     content.hide();
     summary.show();
     $(linkObj).addClass('closed').removeClass('opened');
     $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
   } else {
     content.show();
     summary.hide();
     $(linkObj).removeClass('closed').addClass('opened');
     $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
   } 
   return false;
 }

который в настоящее время доступен каждый раз, когда документация создается в файле с именем dynsections.js, расположенном в корне документации.

Что касается этого кода, вы узнаете условия, позволяющие создавать складной код из своей собственной документации с использованием Javascript, избегая внутренних ошибок выполнения в этой функции и предотвращая неинтерпретацию дальнейшего кода javascript.

  1. элемент dom с уникальным идентификатором id
  2. другой инкапсулированный элемент dom с уникальным идентификатором id-summary
  3. другой инкапсулированный элемент dom с уникальным идентификатором id-content
  4. другой инкапсулированный элемент dom с уникальным идентификатором id-trigger
  5. элемент id-trigger должен содержать атрибут src по крайней мере с 1 символом
  6. атрибуты class основных контейнеров не имеют значения

Имея в виду эти условия, можно создать следующий код.

## <a href="javascript:toggleVisibility($('#example-div'))">Fold me</a>
## <div id="example-div">
##   <div id="example-div-summary"></div>
##   <div id="example-div-content">
##     <pre>
##       foo
##       bar
##     </pre>
##   </div>
##   <div id="example-div-trigger" src="-"></div>
## </div>
## @htmlonly <script type="text/javascript">$("#example-div").ready(function() { toggleVisibility($("#example-div")); });</script> @endhtmlonly

Приведенный выше код doxygen используется для документирования кода bash с использованием bash-doxygen, поэтому он может выглядеть немного отличается от чистого кода doxygen. Первая часть, связанная с контейнерами div, уже описана с упоминанием условий, чтобы соответствовать исходному коду функции toggleVisibility и сделать ее исполняемой без каких-либо ошибок, настраивая комментарии doxygen для наших нужд.

Здесь используется уникальный префикс идентификатора example-div. В первой строке есть настройка гиперссылки для развертывания раздела с использованием JavaScript напрямую в сочетании с некоторым кодом jQuery.

Остался один лайнер в конце. Он содержит скрипт jQuery, который необходимо запустить, чтобы изначально свернуть определенный сегмент. Для bash-doxygen (и, возможно, других языков) блок должен быть однострочным из-за области действия блока скрипта.

Обычно содержимое между \htmlonly и \endhtmlonly вставляется как есть. Если вы хотите вставить фрагмент HTML, который имеет блочную область действия, например таблицу или список, который должен отображаться за пределами ‹p›..‹/p›, это может привести к недопустимому HTML-коду. Вы можете использовать \htmlonly[block], чтобы заставить doxygen завершить текущий абзац и перезапустить его после \endhtmlonly.

как указано в документации doxygen и в комментарии под отмеченным справа решением ответ stackoverflow на включение тегов сценария в документации doxygen.

Спасибо за чтение. Надеюсь, это поможет некоторым людям, которые приходят сюда.

person Marc Bredt    schedule 23.06.2015