775 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			775 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
<!DOCTYPE article PUBLIC "-//GNOME//DTD DocBook PNG Variant V1.1//EN"[
 | 
						|
<!ENTITY version "0.5.0"> <!-- replace with application version -->
 | 
						|
]>
 | 
						|
 | 
						|
<!-- =============Document Header ============================= -->
 | 
						|
 | 
						|
<article id="index"> <!-- please do not change the id -->
 | 
						|
 | 
						|
  <artheader>
 | 
						|
    <title>Writing Extentions for gramps</title>
 | 
						|
    <copyright>
 | 
						|
      <year>2001</year>
 | 
						|
      <holder>Donald N. Allingham</holder>
 | 
						|
    </copyright>
 | 
						|
 | 
						|
  <!-- translators: uncomment this:
 | 
						|
 | 
						|
  <copyright>
 | 
						|
   <year>2001</year>
 | 
						|
   <holder>ME-THE-TRANSLATOR (Latin translation)</holder>
 | 
						|
  </copyright>
 | 
						|
 | 
						|
   -->
 | 
						|
 | 
						|
  <!-- do not put authorname in the header except in copyright - use
 | 
						|
  section "authors" below -->
 | 
						|
 | 
						|
  <!-- Use this legal notice for online documents which depend on -->
 | 
						|
  <!-- core GNOME packages.                                       -->
 | 
						|
  <legalnotice id="legalnotice">
 | 
						|
    <para>
 | 
						|
    Permission is granted to copy, distribute and/or modify this
 | 
						|
    document under the terms of the <ulink type="help"
 | 
						|
    url="gnome-help:fdl"><citetitle>GNU Free Documentation
 | 
						|
    License</citetitle></ulink>, Version 1.1 or any later version
 | 
						|
    published by the Free Software Foundation with no Invariant
 | 
						|
    Sections, no Front-Cover Texts, and no Back-Cover Texts.  A copy
 | 
						|
    of the license can be found <ulink type="help"
 | 
						|
    url="gnome-help:fdl">here</ulink>.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    Many of the names used by companies to distinguish their products
 | 
						|
    and services are claimed as trademarks. Where those names appear
 | 
						|
    in any GNOME documentation, and those trademarks are made aware to
 | 
						|
    the members of the GNOME Documentation Project, the names have
 | 
						|
    been printed in caps or initial caps.
 | 
						|
    </para>
 | 
						|
  </legalnotice>
 | 
						|
 | 
						|
  <!-- Use this legal notice for documents which are placed on  -->
 | 
						|
  <!-- the web, shipped in any way other than online documents  -->
 | 
						|
  <!-- (eg. PS, PDF, or RTF), or which do not depend on the     -->
 | 
						|
  <!-- core GNOME distribution.                                 -->
 | 
						|
  <!--                                                          -->
 | 
						|
  <!-- If you use this version, you must place the following    -->
 | 
						|
  <!-- line in the document declaration at the top of your      -->
 | 
						|
  <!-- document:                                                -->
 | 
						|
  <!--   <!ENTITY FDL SYSTEM "fdl.sgml">                        -->
 | 
						|
  <!-- and the following line at the bottom of your document    -->
 | 
						|
  <!-- after the last </sect1>.                                 -->
 | 
						|
  <!--   &FDL;                                                  -->
 | 
						|
  <!--
 | 
						|
  <legalnotice id="legalnotice">
 | 
						|
    <para>
 | 
						|
    Permission is granted to copy, distribute and/or modify this
 | 
						|
    document under the terms of the <link linkend="fdl"><citetitle>GNU
 | 
						|
    Free Documentation License</citetitle></link>, Version 1.1 or any
 | 
						|
    later version published by the Free Software Foundation with no
 | 
						|
    Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
 | 
						|
    A copy of the license can be found in <xref linkend="fdl">.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    Many of the names used by companies to distinguish their products
 | 
						|
    and services are claimed as trademarks. Where those names appear
 | 
						|
    in any GNOME documentation, and those trademarks are made aware to
 | 
						|
    the members of the GNOME Documentation Project, the names have
 | 
						|
    been printed in caps or initial caps.
 | 
						|
    </para>
 | 
						|
  </legalnotice>
 | 
						|
  -->
 | 
						|
 | 
						|
  <!-- This is the manual version, not application version. --> 
 | 
						|
    <releaseinfo>
 | 
						|
       This is version 1.0 of the Writing Extentions for gramps manual.
 | 
						|
    </releaseinfo>
 | 
						|
 | 
						|
  </artheader>
 | 
						|
 | 
						|
<!-- ============= Introduction ============================== -->
 | 
						|
  <sect1 id="intro">
 | 
						|
    <title>Introduction</title>
 | 
						|
    <para>
 | 
						|
    <application>gramps</application> was intended from the start to
 | 
						|
    allow the user to extend it through a plugin system. Five types of
 | 
						|
    plugins are supported - filters, reports, tools, import filters,
 | 
						|
    and export filters. In a way, an export filter can be viewed as a
 | 
						|
    special type of report, and an import filter can be viewed as a
 | 
						|
    special type of tool.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    All plugins are written in the <application>python</application>
 | 
						|
    language.
 | 
						|
    </para>
 | 
						|
    <sect2 id="intro-filter">
 | 
						|
      <title>Filters</title>
 | 
						|
      <para>
 | 
						|
      A filter is a plugin that be used to temporarily display or hide
 | 
						|
      individuals in the <interface>People View</interface>. The
 | 
						|
      filter is the simplest form of plugin, which only needs to
 | 
						|
      determine if a person meets or fails to meet its criteria. It
 | 
						|
      operates on a single person at a time.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Filters should never alter a database.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="intro-report">
 | 
						|
      <title>Reports</title>
 | 
						|
      <para>
 | 
						|
      A report is a plugin that generates output. The output may be in
 | 
						|
      either a interactive, graphical form, or as an output
 | 
						|
      file. Report plugins are passed a reference to the internal
 | 
						|
      database and a reference to the active person, which allows the
 | 
						|
      plugn to operate on a single person, the entire database, or
 | 
						|
      anything in between.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Plugins that conform to the reportplugin interface appear in the
 | 
						|
        <menuchoice>
 | 
						|
          <guimenu>Reports</guimenu>
 | 
						|
        </menuchoice>
 | 
						|
      menu and in the <interface>Report Selection</interface> dialog
 | 
						|
      box.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      A report should never alter the database.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="intro-tool">
 | 
						|
      <title>Tools</title>
 | 
						|
      <para>
 | 
						|
      A tool is a plugin that alters the database. It may perform
 | 
						|
      something as small changing the case of some text to something
 | 
						|
      as complex as merging redundant individuals. Tools plugins are
 | 
						|
      passed a reference to the internal database, the active person,
 | 
						|
      and a callback function. The callback function is used to notify
 | 
						|
      the main program if it needs to update the display with any
 | 
						|
      modified information.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Plugins that conform to the tool plugin interface appear in the
 | 
						|
        <menuchoice>
 | 
						|
          <guimenu>Tools</guimenu>
 | 
						|
        </menuchoice>
 | 
						|
      menu and in the <interface>Tool Selection</interface> dialog
 | 
						|
      box.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      A tool is allowed (and usually expected) to alter the database.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="intro-import">
 | 
						|
      <title>Import Filters</title>
 | 
						|
      <para>
 | 
						|
      An import filter is a plugin that adds information from another
 | 
						|
      source to the database. It is similar to a tool, but is called
 | 
						|
      differently to allow gramps to distinguish it from a tool.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Plugins that conform to the import filter calling syntax appear
 | 
						|
      in the
 | 
						|
        <menuchoice>
 | 
						|
          <guimenu>File</guimenu>
 | 
						|
          <guisubmenu>Import</guisubmenu>
 | 
						|
        </menuchoice>
 | 
						|
      menu.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      An import filter is allowed to modify the database.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="intro-export">
 | 
						|
      <title>Export Filters</title>
 | 
						|
      <para>
 | 
						|
      An export filter is a plugin that translates the gramps database
 | 
						|
      into the format expected by another program. Since it generates
 | 
						|
      an output file, it is similar to a report generator. However,
 | 
						|
      its calling syntax is different, so that gramps knows how to
 | 
						|
      distiguish it from a report generator.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Plugins that conform to the export filter calling syntax appear
 | 
						|
      in the
 | 
						|
        <menuchoice>
 | 
						|
          <guimenu>File</guimenu>
 | 
						|
          <guisubmenu>Export</guisubmenu>
 | 
						|
        </menuchoice>
 | 
						|
      menu.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      An export filter should not alter the database.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Writing Filters ============================= -->
 | 
						|
 | 
						|
  <sect1 id="writingfilters">
 | 
						|
    <title>Writing Filters</title>
 | 
						|
    <para>
 | 
						|
    Users can create their own filters and add them to
 | 
						|
    <application>gramps</application>.  By adding the filter to the
 | 
						|
    user's private filter directory (<filename
 | 
						|
    class="directory">~/.gramps/filters</filename>), the filter will
 | 
						|
    be automatically recognized the next time that the program is
 | 
						|
    started.
 | 
						|
    </para>
 | 
						|
    <sect2 id="createfilter">
 | 
						|
      <title>Creating a filter</title>
 | 
						|
      <para>
 | 
						|
      Each filter is a class derived from the
 | 
						|
      <function>Filter.Filter</function> class.  The
 | 
						|
      <function>__init__</function> task may be overridden, but if so,
 | 
						|
      should call the <function>__init__</function> function on the
 | 
						|
      <function>Filter.Filter</function> class.  The parent class
 | 
						|
      provides the variable <function>self.text</function>, which
 | 
						|
      contains the text string passed as the qualifier.  This string
 | 
						|
      provides additional information provided by the user. For
 | 
						|
      example, if the filter is used to match names, the qualifier
 | 
						|
      would be used to provide the name that is being compared
 | 
						|
      against.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      All filter classes must define a <function>match</function>
 | 
						|
      function. The function takes one argument (other than
 | 
						|
      <function>self</function>), which is an object of type
 | 
						|
      <function>Person</function> to compare against. The function
 | 
						|
      should return a 1 if the person matches the filter, or a zero if
 | 
						|
      the person does not.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Each filter must be registered, so that
 | 
						|
      <application>gramps</application> knows about it. This is
 | 
						|
      accomplished by calling the
 | 
						|
      <function>Filter.register_filter</function> function. This
 | 
						|
      function takes three arguments - the filter class, a
 | 
						|
      description, and flag that indicates if the qualifier string is
 | 
						|
      needed. The description string appears in the pull down
 | 
						|
      interface within <application>gramps</application>, and helps
 | 
						|
      the user choose the appropriate filter. The qualifier flag tells
 | 
						|
      <application>gramps</application> whether or not the filter
 | 
						|
      needs a qualifier string. If this flag is 0,
 | 
						|
      <application>gramps</application> will disable the entry of a
 | 
						|
      qualifier string.
 | 
						|
      </para>
 | 
						|
      <figure id="filtersrc">
 | 
						|
        <title>Sample filter implementation</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
import Filter
 | 
						|
import string
 | 
						|
 | 
						|
# class definition
 | 
						|
 | 
						|
class SubString(Filter.Filter):
 | 
						|
 | 
						|
    def match(self,person):
 | 
						|
        name = person.getPrimaryName().getName()
 | 
						|
        return string.find(name,self.text) >= 0
 | 
						|
 | 
						|
Filter.register_filter(SubString,
 | 
						|
                       description="Names that contain a substring",
 | 
						|
	               qualifier=1)
 | 
						|
 | 
						|
        </programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Writing Reports ============================= -->
 | 
						|
 | 
						|
  <sect1 id="writingreports">
 | 
						|
    <title>Writing Reports</title>
 | 
						|
    <para>
 | 
						|
    Users can create their own report generators and add them to
 | 
						|
    <application>gramps</application>.  By adding the report generator
 | 
						|
    to the user's private plugin directory (<filename
 | 
						|
    class="directory">~/.gramps/plugins</filename>), the report
 | 
						|
    generator will be automatically recognized the next time that the
 | 
						|
    program is started.
 | 
						|
    </para>
 | 
						|
    <sect2 id="createreport">
 | 
						|
      <title>Creating a report generator</title>
 | 
						|
      <para>
 | 
						|
      Fewer restrictions are made on report generators than on
 | 
						|
      filters.  The report generator is passed the current
 | 
						|
      <application>gramps</application> database and the active
 | 
						|
      person.  The generator needs to take special care to make sure
 | 
						|
      that it does not alter the database in anyway.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      A report generator is a function that takes two arguments
 | 
						|
      — a database (of type <function>RelDataBase</function>)
 | 
						|
      and the currently selected person (of type
 | 
						|
      <function>Person</function>). When called, this task should
 | 
						|
      generate the desired report.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      This function's implementation can be as simple as generating
 | 
						|
      output without the user's intervention, or it could display a
 | 
						|
      graphical interface to allow the user to select options and
 | 
						|
      customize a report.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      As with filters, the report generator must be registered before
 | 
						|
      <application>gramps</application> will understand it. The report
 | 
						|
      generator is registered using the
 | 
						|
      <function>Plugins.register_report</function>. This function
 | 
						|
      takes five arguments.
 | 
						|
      </para>
 | 
						|
      <itemizedlist>
 | 
						|
        <listitem>
 | 
						|
	  <para>
 | 
						|
	  <guilabel>The report generation task</guilabel> This task
 | 
						|
	  that generates the report.
 | 
						|
	  </para>
 | 
						|
	</listitem>
 | 
						|
	<listitem>
 | 
						|
	  <para>
 | 
						|
	  <guilabel>The report category</guilabel> The category in
 | 
						|
	  which the report is grouped in the
 | 
						|
	  <menuchoice><guimenu>Reports</guimenu></menuchoice> menu and
 | 
						|
	  in the <interface>Report Selection</interface> dialog.
 | 
						|
	  </para>
 | 
						|
	</listitem>
 | 
						|
	<listitem>
 | 
						|
	  <para>
 | 
						|
	  <guilabel>The report name</guilabel>
 | 
						|
	  The name of the report.
 | 
						|
	  </para>
 | 
						|
	</listitem>
 | 
						|
	<listitem>
 | 
						|
	  <para>
 | 
						|
	  <guilabel>A text description of the report</guilabel> The
 | 
						|
	  description appears in the report selection tool to provide
 | 
						|
	  the user with a description of what the tools does.
 | 
						|
	  </para>
 | 
						|
	</listitem>
 | 
						|
	<listitem>
 | 
						|
	  <para>
 | 
						|
	  <guilabel>A graphic logo in XPM format</guilabel> This may
 | 
						|
	  be either a path to a filename, or a list of strings
 | 
						|
	  containting the XPM data. If a filename is specified, care
 | 
						|
	  must be taken to make sure the file location is relocatable
 | 
						|
	  and can be determined at runtime.
 | 
						|
	  </para>
 | 
						|
	</listitem>
 | 
						|
      </itemizedlist> 
 | 
						|
      <para>
 | 
						|
      While only the task and report name are required, it is
 | 
						|
      recommended to provide all five parameters.
 | 
						|
      </para>
 | 
						|
      <figure id="reportsrc">
 | 
						|
        <title>Sample report implementation</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
import Plugins
 | 
						|
 | 
						|
def report(database,person):
 | 
						|
   ... actual code ...
 | 
						|
 | 
						|
Plugins.register_report(
 | 
						|
    task=report,
 | 
						|
    category="Category",
 | 
						|
    name="Report Name",
 | 
						|
    description="A text descripition of the report generator",
 | 
						|
    xpm="%s/myfile.xpm" % os.path.dirname(__file__)
 | 
						|
)
 | 
						|
        </programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="alittlehelp">
 | 
						|
      <title>A little help - Format Interfaces</title>
 | 
						|
      <para>
 | 
						|
      <application>gramps</application> provides some help with
 | 
						|
      writing reports.  Several generic python classes exist that aid
 | 
						|
      in the writing of report generators.  These classes provide an
 | 
						|
      abstract interface for a type of document, such as a drawing,
 | 
						|
      word processor document, or a spreadsheet.  From these core
 | 
						|
      classes, <application>gramps</application> derives interfaces to
 | 
						|
      various document formats.  This means that by coding to the
 | 
						|
      generic word processing class (<function>TextDoc</function>), a
 | 
						|
      report generator can instant access to multiple file formats
 | 
						|
      (such as HTML, OpenOffice, and AbiWord).
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      This scheme of deriving a output format from a generic base
 | 
						|
      class also makes it easier to add new formats. Creating a new
 | 
						|
      derivied class targeting a different format (such as
 | 
						|
      <application>KWord</application> or
 | 
						|
      <application>LaTeX</application>) makes it easy for existing
 | 
						|
      report generators to use the new formats.
 | 
						|
      </para>
 | 
						|
    </sect2>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Writing Tools ============================= -->
 | 
						|
 | 
						|
  <sect1 id="writingtools">
 | 
						|
    <title>Writing Tools</title>
 | 
						|
    <para>
 | 
						|
    Users can create their own tools and add them to
 | 
						|
    <application>gramps</application>.  By adding the tool to the
 | 
						|
    user's private plugin directory (<filename
 | 
						|
    class="directory">~/.gramps/plugins</filename>), the tool will be
 | 
						|
    automatically recognized the next time that
 | 
						|
    <application>gramps</application> is started.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    Unlike a report generator, a tool is allowed to modify the
 | 
						|
    database.  The tool is passed the current
 | 
						|
    <application>gramps</application> database, the active person,
 | 
						|
    and a callback function.  The callback function should be called
 | 
						|
    with a non-zero argument upon completion of the tool if the
 | 
						|
    database has been altered.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    As with filters and report generators, tools must be registered
 | 
						|
    before <application>gramps</application> will understand it. The
 | 
						|
    tool is registered using the
 | 
						|
    <function>Plugins.register_tool</function>. This function takes
 | 
						|
    four arguments.
 | 
						|
    </para>
 | 
						|
    <itemizedlist>
 | 
						|
      <listitem>
 | 
						|
        <para>
 | 
						|
	<guilabel>The tool task</guilabel> This task
 | 
						|
	that executes the tool.
 | 
						|
	</para>
 | 
						|
      </listitem>
 | 
						|
      <listitem>
 | 
						|
	<para>
 | 
						|
	<guilabel>The tool category</guilabel> The category in which
 | 
						|
	the tool is grouped in the
 | 
						|
	<menuchoice><guimenu>Tools</guimenu></menuchoice> menu and in
 | 
						|
	the <interface>Tool Selection</interface> dialog.
 | 
						|
	</para>
 | 
						|
      </listitem>
 | 
						|
      <listitem>
 | 
						|
	<para>
 | 
						|
	<guilabel>The tool name</guilabel>
 | 
						|
	The name of the tool.
 | 
						|
	</para>
 | 
						|
      </listitem>
 | 
						|
      <listitem>
 | 
						|
	<para>
 | 
						|
	<guilabel>A text description of the tool</guilabel> The
 | 
						|
	description appears in the Tool Selection dialog to provide
 | 
						|
	the user with a description of what the tool does.
 | 
						|
	</para>
 | 
						|
      </listitem>
 | 
						|
    </itemizedlist> 
 | 
						|
    <para>
 | 
						|
    While only the task and report name are required, it is
 | 
						|
    recommended to provide all five parameters.
 | 
						|
    </para>
 | 
						|
    <figure id="toolsrc">
 | 
						|
      <title>Sample tool implementation</title>
 | 
						|
      <programlisting>
 | 
						|
 | 
						|
import Plugins
 | 
						|
 | 
						|
def tool(database,person,callback):
 | 
						|
   ... actual code ...
 | 
						|
   callback(1)
 | 
						|
 | 
						|
Plugins.register_tool(
 | 
						|
    task=tool,
 | 
						|
    category="Category",
 | 
						|
    name="Tool Name",
 | 
						|
    description="A text descripition of the tool"
 | 
						|
)
 | 
						|
      </programlisting>
 | 
						|
    </figure>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Import Filters ============================= -->
 | 
						|
 | 
						|
  <sect1 id="writingimportfilters">
 | 
						|
    <title>Writing Import Filters</title>
 | 
						|
    <para>
 | 
						|
    Import filters are similar to tools, since they are allowed to
 | 
						|
    modify the databases. An import filter is a task that accepts
 | 
						|
    three arguments — a database, the filename of the file that
 | 
						|
    is to be imported, and a callback function.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    The database may or may not have data already in it. The import
 | 
						|
    filter cannot assume that data neither already exists nor that the
 | 
						|
    database is empty.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    The callback function is different from the callback function used
 | 
						|
    for tools. The import filter's callback function is used to
 | 
						|
    indicate progress and update the status bar during the import
 | 
						|
    process. The function takes a value between 0.0 and 1.0, where 0.0
 | 
						|
    represents the start of the import and 1.0 represents the
 | 
						|
    completion of the import.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    As with the other plugin types, an import filter must be
 | 
						|
    registered with <application>gramps</application>. This is
 | 
						|
    accomplished by calling the
 | 
						|
    <function>Plugins.register_import</function> task. The
 | 
						|
    <function>Plugins.register_import</function> accepts two arguments
 | 
						|
    — the function the performs the import and a string
 | 
						|
    providing a brief description. This description is used as the
 | 
						|
    menu entry under the
 | 
						|
    <menuchoice>
 | 
						|
      <guimenu>File</guimenu>
 | 
						|
      <guisubmenu>Import</guisubmenu>
 | 
						|
    </menuchoice>
 | 
						|
    menu.
 | 
						|
    </para>
 | 
						|
    <figure id="importexample">
 | 
						|
      <title>Sample Import Implementation</title>
 | 
						|
      <programlisting>
 | 
						|
 | 
						|
import Plugins
 | 
						|
 | 
						|
def gedcom_import(database,filename,callback):
 | 
						|
    ... actual code ...
 | 
						|
 | 
						|
Plugins.register_import(gedcom_import,"GEDCOM import")
 | 
						|
 | 
						|
      </programlisting>
 | 
						|
    </figure>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Export Filters ============================= -->
 | 
						|
 | 
						|
  <sect1 id="writingexportfilters">
 | 
						|
    <title>Writing Export Filters</title>
 | 
						|
    <para>
 | 
						|
    Export filters are similar to report generators. They are not
 | 
						|
    allowed to modify the database. An export filter accepts three
 | 
						|
    arguments — a database, the filename of the file that is to
 | 
						|
    be written, and a callback function.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    The callback function is indentical from the callback function
 | 
						|
    used for import filters. The export filter's callback function is
 | 
						|
    used to indicate progress and update the status bar during the
 | 
						|
    export process. The function takes a value between 0.0 and 1.0,
 | 
						|
    where 0.0 represents the start of the export and 1.0 represents
 | 
						|
    the completion of the export.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    As with the other plugin types, an export filter must be
 | 
						|
    registered with <application>gramps</application>. This is
 | 
						|
    accomplished by calling the
 | 
						|
    <function>Plugins.register_export</function> task. The
 | 
						|
    <function>Plugins.register_export</function> accepts two arguments
 | 
						|
    — the function the performs the import and a string
 | 
						|
    providing a brief description. This description is used as the
 | 
						|
    menu entry under the
 | 
						|
    <menuchoice>
 | 
						|
      <guimenu>File</guimenu>
 | 
						|
      <guisubmenu>Export</guisubmenu>
 | 
						|
    </menuchoice>
 | 
						|
    menu.
 | 
						|
    </para>
 | 
						|
    <figure id="exportexample">
 | 
						|
      <title>Sample Export Implementation</title>
 | 
						|
      <programlisting>
 | 
						|
 | 
						|
import Plugins
 | 
						|
 | 
						|
def gedcom_export(database,filename,callback):
 | 
						|
    ... actual code ...
 | 
						|
 | 
						|
Plugins.register_export(gedcom_export,"GEDCOM export")
 | 
						|
 | 
						|
      </programlisting>
 | 
						|
    </figure>
 | 
						|
  </sect1>
 | 
						|
  <sect1 id="commontasks">
 | 
						|
    <title>Common tasks</title> 
 | 
						|
    <para>
 | 
						|
    While this manual does not document the
 | 
						|
    <application>gramps</application> database interface, this section
 | 
						|
    shows a few common tasks.
 | 
						|
    </para>
 | 
						|
    <sect2 id="gettingnames">
 | 
						|
      <title>Printing names of people</title>
 | 
						|
      <para>
 | 
						|
      This example shows how to display the name of people in the
 | 
						|
      database. It assumes that the database is called
 | 
						|
      <function>db</function>. To get a list of people, it calls the
 | 
						|
      <function>getPersonMap</function> method, which returns a map of
 | 
						|
      <application>gramps</application> ID to
 | 
						|
      <function>Person</function> objects. Calling the
 | 
						|
      <function>valus</function> method of the returned map returns a
 | 
						|
      list of people. For each person, the primary name is extracted,
 | 
						|
      and then the <function>Name</function> object's
 | 
						|
      <function>getName</function> method is called to build a
 | 
						|
      presentable name from the individual name components.
 | 
						|
      </para>
 | 
						|
      <figure id="displaynames">
 | 
						|
        <title>Displaying names</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
for person in db.getPersonMap().values():
 | 
						|
    name = person.getPrimaryName()
 | 
						|
    print name.getName()
 | 
						|
 | 
						|
	</programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="listingevents">
 | 
						|
      <title>Displaying the events of person</title>
 | 
						|
      <para>
 | 
						|
      This example shows how to display the public events associated
 | 
						|
      with a person. It assumes that the person is called
 | 
						|
      <function>person</function>.
 | 
						|
      </para>
 | 
						|
      <figure id="eventexample">
 | 
						|
        <title>Displaying Event Information</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
for event in person.getEventList():
 | 
						|
    if event.getPrivacy() == 0:
 | 
						|
        print "Event:",event.getName()
 | 
						|
	print "Date:",event.getDate()
 | 
						|
	print "Place:",event.getPlaceName()
 | 
						|
 | 
						|
	</programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="printfamily">
 | 
						|
      <title>Print the members of each family</title>
 | 
						|
      <para>
 | 
						|
      This example shows how to display the parents and children of
 | 
						|
      each family in the database. It assumes that the database is called
 | 
						|
      <function>db</function>.
 | 
						|
      </para>
 | 
						|
      <figure id="familyexample">
 | 
						|
        <title>Displaying Family Information</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
for family in db.getFamilyMap().values:
 | 
						|
    print "-------------------"
 | 
						|
    print "Family ID:",family.getId()
 | 
						|
    father = family.getFather()
 | 
						|
    if father != None:
 | 
						|
        print "Father:",father.getPrimaryName().getName()
 | 
						|
    mother = family.getMother()
 | 
						|
    if mother != None:
 | 
						|
        print "Mother:",mother.getPrimaryName().getName()
 | 
						|
    for child in family.getChildList():
 | 
						|
        print "Child:",child.getPrimaryName().getName()
 | 
						|
 | 
						|
	</programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
    <sect2 id="personsfamily">
 | 
						|
      <title>Display the marriages/relationships of a person</title>
 | 
						|
      <para>
 | 
						|
      This example shows how to display the families and relationships
 | 
						|
      in which the person is considered a spouse or parent. It assumes
 | 
						|
      that the person is called <function>person</function>.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
      Relationships between people can be complex. Because someone is
 | 
						|
      male, does not necessarily mean that the person will be
 | 
						|
      considered the "Father" of a relationship. In relationships of
 | 
						|
      type "Partners", the "father" and "mother" of the relationship
 | 
						|
      should be of the same gender. So to determine the spouse of a
 | 
						|
      person, it is usually best to compare the person against what is
 | 
						|
      returned by <function>getFather</function> and
 | 
						|
      <function>getMother</function> to find the one that is not
 | 
						|
      equal.  It should also be noted that the
 | 
						|
      <function>getFather</function> and
 | 
						|
      <function>getMother</function> methods will return None if noone
 | 
						|
      has been associated with that role in the family.
 | 
						|
      </para>
 | 
						|
      <figure id="relexample">
 | 
						|
        <title>Displaying Relationship Information</title>
 | 
						|
        <programlisting>
 | 
						|
 | 
						|
for family in person.getFamilyList():
 | 
						|
    print "-------------------"
 | 
						|
    print "Family ID:",family.getId()
 | 
						|
    print "Relationship Type:",family.getRelationship()
 | 
						|
    father = family.getFather()
 | 
						|
    if father != None and father != person:
 | 
						|
        print "Spouse:",father.getPrimaryName().getName()
 | 
						|
    mother = family.getMother()
 | 
						|
    if mother != None and mother != person:
 | 
						|
        print "Spouse:",mother.getPrimaryName().getName()
 | 
						|
 | 
						|
	</programlisting>
 | 
						|
      </figure>
 | 
						|
    </sect2>
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Authors ================================ -->
 | 
						|
 | 
						|
  <sect1 id="authors">
 | 
						|
    <title>Authors</title>
 | 
						|
    <para>
 | 
						|
    <application>gramps</application> was written by Don Allingham
 | 
						|
    (<email>dallingham@users.sourceforge.net</email>). To find more
 | 
						|
    information about <application>gramps</application>, please visit
 | 
						|
    the <ulink url="http://gramps.sourceforge.net" type="http">gramps
 | 
						|
    web page</ulink>.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    This manual was written by Don Allingham
 | 
						|
    (<email>dallingham@users.sourceforge.net</email>).
 | 
						|
    </para>
 | 
						|
 | 
						|
<!-- For translations: uncomment this:
 | 
						|
    <para>
 | 
						|
    Latin translation was done by ME
 | 
						|
    (<email>MYNAME@MYADDRESS</email>). Please send all comments and
 | 
						|
    suggestions regarding this translation to SOMEWHERE.
 | 
						|
    </para>
 | 
						|
-->
 | 
						|
  </sect1>
 | 
						|
 | 
						|
<!-- ============= Application License ============================= -->
 | 
						|
 | 
						|
  <sect1 id="license">
 | 
						|
    <title>License</title>
 | 
						|
    <para>
 | 
						|
    This program is free software; you can redistribute it and/or
 | 
						|
    modify it under the terms of the <ulink type="help"
 | 
						|
    url="gnome-help:gpl"> <citetitle>GNU General Public
 | 
						|
    License</citetitle></ulink> as published by the Free Software
 | 
						|
    Foundation; either version 2 of the License, or (at your option)
 | 
						|
    any later version.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    <citetitle>GNU General Public License</citetitle> for more
 | 
						|
    details.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
    A copy of the <citetitle>GNU General Public License</citetitle> is
 | 
						|
    included as an appendix to the <citetitle>GNOME Users
 | 
						|
    Guide</citetitle>.  You may also obtain a copy of the
 | 
						|
    <citetitle>GNU General Public License</citetitle> from the Free
 | 
						|
    Software Foundation by visiting <ulink type="http"
 | 
						|
    url="http://www.fsf.org">their Web site</ulink> or by writing to
 | 
						|
    <address>
 | 
						|
    Free Software Foundation, Inc.  <street>59 Temple Place</street> -
 | 
						|
    Suite 330 <city>Boston</city>, <state>MA</state>
 | 
						|
    <postcode>02111-1307</postcode> <country>USA</country>
 | 
						|
    </address>
 | 
						|
    </para>
 | 
						|
  </sect1>
 | 
						|
</article>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |