<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2003/XInclude" type="topic" id="documentation" xml:lang="pt-BR">

  <info>
    <link type="guide" xref="index#general-guidelines"/>

    <credit type="author copyright">
      <name>Federico Mena-Quintero</name>
      <email its:translate="no">federico@gnome.org</email>
      <years>2013</years>
    </credit>
    <credit type="author copyright">
      <name>Philip Withnall</name>
      <email its:translate="no">philip.withnall@collabora.co.uk</email>
      <years>2015</years>
    </credit>
    <credit type="author copyright">
      <name>A equipe do GTK+</name>
    </credit>

    <include xmlns="http://www.w3.org/2001/XInclude" href="cc-by-sa-3-0.xml"/>

    <desc>Adicionando documentação a bibliotecas e APIs</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Rafael Fontenelle</mal:name>
      <mal:email>rafaelff@gnome.org</mal:email>
      <mal:years>2017</mal:years>
    </mal:credit>
  </info>

  <title>Documentação</title>

  <synopsis>
    <title>Resumo</title>

    <list>
      <item><p>Use gtk_doc com configurações atualizadas para documentação de API. (<link xref="#gtk-doc"/>)</p></item>
      <item><p>Use entidades XML para inclusão de símbolos externos à documentação. (<link xref="#build-system"/>)</p></item>
      <item><p>Use uma tabela de conteúdos consistente e padrão para toda documentação de API para manter a familiaridade. (<link xref="#standard-layout"/>)</p></item>
      <item><p>Use <cmd>gdbus-codegen</cmd> para gerar documentação de API do D-Bus para incluir na compilação de gtk-doc. (<link xref="#dbus-api"/>)</p></item>
      <item><p>Adicione anotações de introspecção a toda documentação de API. (<link xref="#introspection-annotations"/>)</p></item>
      <item><p>Adicione linhas <code>Since</code> para toda documentação de API. (<link xref="#symbol-versioning"/>)</p></item>
      <item><p>Habilite testes de gtk-doc. (<link xref="#keeping-up-to-date"/>)</p></item>
    </list>
  </synopsis>

  <section id="gtk-doc">
    <title>gtk-doc</title>

    <p>O sistema de documentação preferido para bibliotecas do GNOME é o <link href="http://www.gtk.org/gtk-doc/">gtk-doc</link>, o qual extrai comentários em linha do código e permite que você compile um documento <link href="http://docbook.org/">DocBook</link> e coleção de páginas HTML. Esses podem ser lidos em <link href="https://wiki.gnome.org/Apps/Devhelp">Devhelp</link>. Muito da infraestrutura do GNOME é construído para lidar com documentação escrita usando gtk-doc.</p>
  </section>

  <section id="build-system">
    <title>Sistema de compilação</title>

    <p>Para integrar gtk-doc a um sistema de compilação do projeto, siga as <link href="https://developer.gnome.org/gtk-doc-manual/stable/settingup.html.en"> instruções no manual do gtk-doc</link>. Note que enquanto o arquivo <file>sections.txt</file> é gerado automaticamente na primeira vez que o gtk-doc é executado, ele não é gerado subsequentemente, e deve ser mantido atualizado. Ele também deve estar <link href="https://developer.gnome.org/gtk-doc-manual/stable/settingup_vcs.html.en"> no controle de versão</link>.</p>

    <p>A opção <code>--flavour no-tmpl</code> do gtk-doc deve ser usada, e o modo XML deve ser usado no lugar do SGML. (modo tmpl e SGML estão ambos desatualizados e são mais lentos que XML.)</p>
    <p>Se a versão do pacote for necessária para ser substituída na documentação, crie um arquivo chamado <file>docs/version.xml.in</file>, contendo:</p>
    <code>@PACKAGE_VERSION@</code>
    <p>Adicione-o a <code>AC_CONFIG_FILES</code> no <file>configure.ac</file>, então inclua-o ao arquivo central da documentação (<file>*-docs.xml</file>) usando: <code>&lt;!ENTITY version SYSTEM "version.xml"&gt;</code> no <code>DOCTYPE</code> sobre o documento. A versão do pacote pode ser usada em linha como <code>&amp;version;</code>.</p>
  </section>

  <section id="standard-layout">
    <title>Layout padrão</title>

    <p>Usar um layout padrão para a tabela de conteúdos, seções, apêndices etc. significa que o mesmo modelo de <file><var>nome-do-projeto</var>-docs.xml</file> pode ser reusado com algumas alterações entre projetos. Ele também significa que o layout da documentação é similar por todos os projetos, fazendo dele mais familiar para os desenvolvedores.</p>

    <p>O layout a seguir é sugerido:</p>
    <listing>
      <title><file><var>nome-do-projeto</var>-docs.xml</file></title>
      <desc>Um arquivo de modelo de nível superior do gtk-doc para um projeto</desc>
      <code mime="application/docbook+xml"><xi:include href="example-docs.xml" parse="text"/></code>
    </listing>
  </section>

  <section id="licensing">
    <title>Licenciamento</title>
    <p>É importante tornar a licença usada para referências de API bem clara, especialmente se elas contiverem exemplos de código que poderia ser copiado.</p>

    <p>Geralmente, projetos usam a mesma licença para sua referência de API que para o código do projeto em si, para evitar confusão. Alguns projetos usam CC-BY-SA 3.0 para toda documentação de referência. A escolha é sua.</p>

    <p>Como mostrado no <link xref="#standard-layout">Layout padrão</link>, você deve incluir um <file>license.xml</file> no arquivo DocBook de nível superior do gtk-doc, o qual fornece o texto completo para sua licença de documentação.</p>
  </section>

  <section id="public-api">
    <title>API pública</title>

    <p>Todas APIs públicas devem ter comentários de gtk-doc. Para funções, essas devem ser colocadas no arquivo fonte, diretamente sobre a função.</p>

    <code mime="text/x-csrc" style="valid">/**
 * gtk_get_flow:
 * @widget: a #GtkWidget
 *
 * Gets the flow of a widget.
 *
 * Note that flows may be laminar or turbulent...
 *
 * Returns: (transfer none): the flow of @widget
 */
GtkFlow *
gtk_get_flow (GtkWidget *widget)
{

  ...

}</code>

    <p>Comentários de documentação para macros, tipos de função, structs de classe, etc. devem ser colocados próximo às definições, geralmente em arquivos de cabeçalhos.</p>

    <p>Introduções de seção devem ser colocadas no arquivo fonte que elas descrevem, após o cabeçalho de licença:</p>

    <code mime="text/x-csrc" style="valid">/**
 * SECTION:gtksizerequest
 * @Short_Description: Height-for-width geometry management
 * @Title: GtkSizeRequest
 *
 * The GtkSizeRequest interface is GTK+'s height-for-width (and
 * width-for-height) geometry management system.
 * ...
 */</code>

    <p>Tenha em mente que para incluir uma função, macro, tipo de função ou tipo de struct, ele precisa ser listado no arquivo de <file>nomemodulo-sections.txt</file> da documentação.</p>

    <p>Para documentação adequadamente uma nova classe, ele precisa ser dado em sua própria seção no <file>nomemodulo-sections.txt</file> e a função <code>get_type()</code> para sua classe precisa ser listada em seu <file>nomemodulo.types</file>.</p>
  </section>

  <section id="introspection-annotations">
    <title>Anotações de introspecção</title>

    <p>Cada comentário gtk-doc deve ter as <link href="https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations">anotações de introspeção de GObject</link> adequada. Essa são úteis por dois motivos:</p>
    <list type="numbered">
      <item><p>Elas adicionam informações importantes sobre tipos de parâmetros, anulabilidade e gerenciamento de memória para a documentação de API C gerada pelo gtk-doc.</p></item>
      <item><p>Elas permitem que APIs públicas sejam automaticamente vinculadas a outras linguagens, tais como Python ou JavaScript.</p></item>
    </list>

    <p>Anotações de introspecção adicionam informações às APIs (funções, parâmetros de função, valor de retorno de função, estruturas, propriedades de GObject, sinais de GObject) nas quais, do contrário, não está presente na API C legível por máquina e existe apenas na forma de documentação legível por humano ou convenção. Elas são muito importantes.</p>

    <p>Em comentários de gtk-doc, anotações devem ser preferidos a equivalentes legíveis por humanos, Por exemplo, ao documentar o parâmetro de uma função que pode ser <code>NULL</code>, use a anotação <code>(nullable)</code> e, vez de algum texto:</p>
    <code mime="text/x-csrc" style="valid">/**
 * my_function:
 * @parameter: (nullable): some parameter which affects something
 *
 * Body of the function documentation.
 */</code>

    <p>Em vez de:</p>
    <code mime="text/x-csrc" style="invalid">/**
 * my_bad_function:
 * @parameter: some parameter which affects something, or %NULL to ignore
 *
 * Bad body of the function documentation.
 */</code>

    <p>Para mais informação sobre introspecção, veja as <link xref="introspection">diretrizes de introspecção</link>.</p>
  </section>

  <section id="symbol-versioning">
    <title>Versionamento de símbolo</title>

    <p>Quando um símbolo é adicionado à API pública, ele deve ter um comentário de documentação adicionado. Esse comentário deve sempre conter uma linha <code>Since</code> com o número da versão de pacote do lançamento que primeiro conterá a nova API. Isso deve ser o número que está no <file>configure.in</file> se<link xref="versioning#release-process">incrementação de versão pós-lançamento</link> estiver sendo usado.</p>

    <p>Por exemplo:</p>
    <code mime="text/x-csrc" style="valid">/**
 * my_function:
 * @param: some parameter
 *
 * Body of the function documentation.
 *
 * Since: 0.5.0
 */</code>

    <p>gtk-doc usa essa informação para gerar índices das APIs adicionadas em cada lançamento. Essas devem ser adicionadas ao <file>*-docs.xml</file> principal como um apêndice:</p>
    <code mime="application/docbook+xml">&lt;part&gt;
	&lt;title&gt;Appendices&lt;/title&gt;
	&lt;index id="api-index-full"&gt;
		&lt;title&gt;API Index&lt;/title&gt;
		&lt;xi:include href="xml/api-index-full.xml"&gt;&lt;xi:fallback/&gt;&lt;/xi:include&gt;
	&lt;/index&gt;
	&lt;index id="api-index-deprecated"&gt;
		&lt;title&gt;Index of deprecated symbols&lt;/title&gt;
		&lt;xi:include href="xml/api-index-deprecated.xml"&gt;&lt;xi:fallback/&gt;&lt;/xi:include&gt;
	&lt;/index&gt;
	&lt;index role="0.1.0"&gt;
		&lt;title&gt;Index of new symbols in 0.1.0&lt;/title&gt;
		&lt;xi:include href="xml/api-index-0.1.0.xml"&gt;&lt;xi:fallback/&gt;&lt;/xi:include&gt;
	&lt;/index&gt;
	&lt;!-- More versions here. --&gt;
	&lt;xi:include href="xml/annotation-glossary.xml"&gt;&lt;xi:fallback /&gt;&lt;/xi:include&gt;
&lt;/part&gt;</code>
  </section>

  <section id="dbus-api">
    <title>APIs de D-Bus</title>

    <p>Descrições de interface D-Bus contêm comentários de documentação, e podem ser extraídas do XML usando <cmd>gdbus-codegen</cmd> e transformadas em arquivos DocBook para serem incluídas pelo gtk-doc.</p>

    <p>Os arquivos DocBook podem ser incluídos no arquivo <file>*-docs.xml</file> principal usando:</p>
    <code mime="application/docbook+xml">&lt;chapter&gt;
  &lt;title&gt;C Interfaces&lt;/title&gt;
  &lt;partintro&gt;
    &lt;para&gt;C wrappers for the D-Bus interfaces.&lt;/para&gt;
  &lt;/partintro&gt;

  &lt;xi:include href="xml/SomeDBusService.xml"/&gt;
  &lt;xi:include href="xml/SomeOtherService.xml"/&gt;
&lt;/chapter&gt;</code>

    <p>Os arquivos XML gerados devem ser incluídos na variável <code>content_files</code> em seu <file>Makefile.am</file> de gtk-doc, do contrário a compilação vai falhar. (Isso é para corrigir situações nas quais <code>builddir</code> não é igual a <code>srcdir</code>.)</p>
  </section>

  <section id="keeping-up-to-date">
    <title>Mantendo a documentação atualizada</title>

    <p>
      gtk-doc comes with support for checking the documentation with some basic
      tests. These check that all version indexes are included in the main
      <file>*-docs.xml</file> file and that all symbols are documented, among
      other things.
    </p>

    <p>Esses testes devem sempre estar habilitados, adicionando o seguinte para seu <file>Makefile.am</file> de gtk-doc:</p>
    <code>TESTS = $(GTKDOC_CHECK)</code>

    <p>Eles serão, então, executados como parte do <cmd>make check</cmd>.</p>
  </section>
</page>
