[PyObjC-svn] r2475 - in trunk/pyobjc/pyobjc-core/Doc: . 06tutorial 07tutorial_embed dev lib tutorials tutorials/step12-src tutorials/step3-MainMenu.nib

[email protected] Sun, 09 May 2010 08:48:45 -0500
Newsgroups gmane.comp.python.pyobjc.cvs
Message-ID <[email protected]>
Author: ronaldoussoren
Date: Sun May  9 08:48:45 2010
New Revision: 2475

Log:
Move the documentation to sphinx, thanks to Virgil Dupras for
the patch.


Added:
   trunk/pyobjc/pyobjc-core/Doc/blocks.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/24blocks.txt
   trunk/pyobjc/pyobjc-core/Doc/dev/
   trunk/pyobjc/pyobjc-core/Doc/dev/coding-style.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/50coding-style.txt
   trunk/pyobjc/pyobjc-core/Doc/dev/structure.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/49structure.txt
   trunk/pyobjc/pyobjc-core/Doc/dev/wrapping.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/54wrapping.txt
   trunk/pyobjc/pyobjc-core/Doc/fsref-fsspec.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/22fsref-fsspec.txt
   trunk/pyobjc/pyobjc-core/Doc/protocols.rst
      - copied unchanged from r2348, /trunk/pyobjc/pyobjc-core/Doc/21protocols.txt
   trunk/pyobjc/pyobjc-core/Doc/tutorials/
      - copied from r2348, /trunk/pyobjc/pyobjc-core/Doc/06tutorial/
   trunk/pyobjc/pyobjc-core/Doc/tutorials/embedded.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/07tutorial_embed/index.txt
   trunk/pyobjc/pyobjc-core/Doc/tutorials/embedded_src.zip   (contents, props changed)
   trunk/pyobjc/pyobjc-core/Doc/tutorials/firstapp.rst
      - copied, changed from r2348, /trunk/pyobjc/pyobjc-core/Doc/06tutorial/index.txt
   trunk/pyobjc/pyobjc-core/Doc/tutorials/firstapp_src.zip   (contents, props changed)
   trunk/pyobjc/pyobjc-core/Doc/xcode.rst
      - copied unchanged from r2348, /trunk/pyobjc/pyobjc-core/Doc/23xcode.txt
Removed:
   trunk/pyobjc/pyobjc-core/Doc/06tutorial/
   trunk/pyobjc/pyobjc-core/Doc/07tutorial_embed/
   trunk/pyobjc/pyobjc-core/Doc/21protocols.txt
   trunk/pyobjc/pyobjc-core/Doc/22fsref-fsspec.txt
   trunk/pyobjc/pyobjc-core/Doc/23xcode.txt
   trunk/pyobjc/pyobjc-core/Doc/24blocks.txt
   trunk/pyobjc/pyobjc-core/Doc/49structure.txt
   trunk/pyobjc/pyobjc-core/Doc/50coding-style.txt
   trunk/pyobjc/pyobjc-core/Doc/54wrapping.txt
   trunk/pyobjc/pyobjc-core/Doc/tutorials/index.txt
   trunk/pyobjc/pyobjc-core/Doc/tutorials/step12-src/
   trunk/pyobjc/pyobjc-core/Doc/tutorials/step3-MainMenu.nib/
   trunk/pyobjc/pyobjc-core/Doc/tutorials/step4-CurrencyConverter.py
   trunk/pyobjc/pyobjc-core/Doc/tutorials/step5-setup.py
   trunk/pyobjc/pyobjc-core/Doc/tutorials/step8-CurrencyConverter.py
Modified:
   trunk/pyobjc/pyobjc-core/Doc/10PyObjCTools.txt
   trunk/pyobjc/pyobjc-core/Doc/index.rst
   trunk/pyobjc/pyobjc-core/Doc/intro.rst
   trunk/pyobjc/pyobjc-core/Doc/lib/module-PyObjCTools.rst

Modified: trunk/pyobjc/pyobjc-core/Doc/10PyObjCTools.txt
==============================================================================
--- trunk/pyobjc/pyobjc-core/Doc/10PyObjCTools.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/10PyObjCTools.txt	Sun May  9 08:48:45 2010
@@ -1,244 +0,0 @@
-===============================
-PyObjCTools: The PyObjC Toolbox
-===============================
-
-Introduction
-------------
-
-The package ``PyObjCTools`` contains a number of (basically unrelated) modules
-with useful functionality. These have been placed inside a module to avoid
-cluttering the global namespace.
-
-The rest of this document provides documentation for these modules, but lets
-start with a short overview.
-
-* ``PyObjCTools.AppHelper``
-
-Utility functions for use with the ``AppKit`` module.
-
-* ``PyObjCTools.Conversion``
-
-Functions for converting between Cocoa and pure Python data structures.
-
-* ``PyObjCTools.KeyValueCoding``
-
-A Python API for working with `Key-Value Coding`__. 
-
-.. __: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/
-
-* ``PyObjCTools.NibClassBuilder``
-
-Module containing a magic super-class that can read information about the
-actual super-class and implemented actions and outlets from a NIB file.
-
-* ``PyObjCTools.MachSignals``
-
-Module to make it possible to integrate signal handling into the main
-runloop.
-
-* ``PyObjCTools.Debugging``
-
-Allows logging of NSException stack traces.  This module should only be used
-during development.
-
-* ``PyObjCTools.Signals``
-
-Module that tries to print useful information when the program gets a fatal
-exception. This module should only be used during development.
-
-* ``PyObjCTools.XcodeSupport``
-
-Used by the PyObjC Xcode templates to derive py2app options from an Xcode
-project file.
-
-
-``PyObjCTools.AppHelper``
-.........................
-
-This module exports functions that are useful when working with the
-``AppKit`` framework (or more generally, run loops).
-
-* ``callAfter(func, *args, **kwargs) -> None``
-
-  Call a function on the main thread.  Returns immediately.
-
-* ``callLater(delay, func, *args, **kwargs) -> None``
-
-  Call a function on the main thread after a delay.  Returns immediately.
-
-* ``endSheetMethod(method) -> selector``
-
-  Convert a method to a form that is suitable to use as the delegate callback
-  for sheet methods.
-
-* ``stopEventLoop() -> None``
-
-  Stops the event loop (if started by ``runConsoleEventLoop``) or sends the
-  ``NSApplication`` a ``terminate:`` message.
-
-* ``runConsoleEventLoop(argv=None, installInterrupt=False, mode=NSDefaultRunLoopMode) -> None``
-
-  Run a ``NSRunLoop`` in a stoppable way (with ``stopEventLoop``).
-
-* ``runEventLoop(argv=None, unexpectedErrorAlert=unexpectedErrorAlert, installInterrupt=None, pdb=None, main=NSApplicationMain) -> None``
-
-  Run the event loop using ``NSApplicationMain`` and ask the user if we should
-  continue if an exception is caught.
-
-  This function doesn't return unless it throws an exception.
-
-
-``PyObjCTools.Conversion``
-.............................
-
-Functions for converting between Cocoa and pure Python data structures.
-
-* ``propertyListFromPythonCollection(pyCol, conversionHelper=None) -> ocCol``
-
-  Convert a Python collection (dictionary, array, tuple, string) into an 
-  Objective-C collection.
-
-  If conversionHelper is defined, it must be a callable.  It will be called 
-  for any object encountered for which ``propertyListFromPythonCollection()``
-  cannot automatically convert the object.   The supplied helper function 
-  should convert the object and return the converted form.  If the conversion 
-  helper cannot convert the type, it should raise an exception or return None.
-
-* ``pythonCollectionFromPropertyList(ocCol, conversionHelper=None) -> pyCol``
-
-  Converts a Foundation based collection-- a property list-- into a Python 
-  collection.  Like ``propertyListFromPythonCollection()``, ``conversionHelper``
-  is an optional callable that will be invoked any time an encountered object 
-  cannot be converted.
-
-``PyObjCTools.KeyValueCoding``
-..............................
-
-A module for working with Key-Value Coding in Python. Key-Value Coding is
-explained `on the Apple website`__
-
-.. __: http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/
-
-This module provides a Python interface to some of that functionality. The
-interface is modeled on the ``getattr`` and ``setattr`` functions.
-
-* ``getKey(object, key) -> value``
-
-    Get the attribute referenced by 'key'. The key is used
-    to build the name of an attribute, or attribute accessor method.
-
-    The following attributes and accesors are tried (in this order):
-
-    - Accessor 'getKey'
-    - Accesoor 'get_key'
-    - Accessor or attribute 'key'
-    - Accessor or attribute 'isKey'
-    - Attribute '_key'
-
-    If none of these exist, raise KeyError
-
-* ``getKeyPath(object, keypath) -> value``
-
-  Like ``getKey`` but using a key path. The ``keypath`` is a sequence of keys
-  separated by dots. It calls ``getKey`` to follow the path and returns the
-  final value.
-
-* ``setKey(object, key, value) -> None``
-
-  Set the value of ``key`` to ``value``.
-
-  The following values are used for setting the value for a key named ``key``
-  (first match wins):
-
-  - Call ``object.set_key(value)``
-
-  - Call ``object.setKey(value)``
-
-  - Call ``object._set_key(value)``
-
-  - Call ``object._setKey(value)``
-
-  - Check if ``_key`` is an attribute and if so, set its value
-
-  - Try to set the attribute ``key``.
-
-  Raises ``KeyError`` if the key cannot be changed.
-
-* ``setKeyPath(object, keypath, value) -> None``
-
-  The same as ``setKey``, but now using a key path. A key path is a sequence
-  of keys separated by dots. The ``getKey`` function is used to traverse 
-  the path up to the last item, and then ``setKey`` is used to change the value.
-
-PyObjCTools.NibClassBuilder
-...........................
-
-Extracting class definitions from nibs
-++++++++++++++++++++++++++++++++++++++
-
-The module maintains a global set of class definitions, extracted from
-nibs. To add the classes from a nib to this set, use the ``extractClasses()``
-function. It can be called in two ways:
-
-- ``extractClasses(nibName, bundle=<current-bundle>)``
-
-  This finds the nib by name from a bundle. If no bundle
-  if given, the ``objc.currentBundle()`` is searched.
-
-- ``extractClasses(path=pathToNib)``
-
-  This uses an explicit path to a nib.
-
-``extractClasses()`` can be called multiple times for the same bundle: the
-results are cached so no almost extra overhead is caused.
-
-Using the class definitions
-+++++++++++++++++++++++++++
-
-The module contains a "magic" base (super) class called ``AutoBaseClass``.
-Subclassing ``AutoBaseClass`` will invoke some magic that will look up the
-proper base class in the class definitions extracted from the nib(s).
-If you use multiple inheritance to use Cocoa's "informal protocols",
-you *must* list ``AutoBaseClass`` as the first base class. For example::
-
-    class PyModel(AutoBaseClass, NSTableSource):
-        ...
-
-
-The ``NibInfo`` class
-+++++++++++++++++++++
-
-The parsing of nibs and collecting the class definition is done by the
-``NibInfo`` class. You normally don't use it directly, but it's here if you
-have special needs.
-
-The command line tool
-+++++++++++++++++++++
-
-When run from the command line, this module invokes a simple command
-line program, which you feed paths to nibs. This will print a Python
-template for all classes defined in the nib(s). For more documentation,
-see the commandline_doc variable, or simply run the program without
-arguments. It also contains a simple test program.
-
-PyObjCTools.Signals
-...................
-
-This module provides two functions that can be useful while investigating
-random crashes of a PyObjC program. These crashes are often caused by 
-Objective-C style weak references or incorrectly implemented protocols.
-
-- ``dumpStackOnFatalSignal()``
-
-  This function will install signal handlers that print a stack trace and
-  then re-raise the signal.
-
-- ``resetFatalSignals()``
-
-  Restores the signal handlers to the state they had before the call to
-  dumpStackOnFatalSignal.
-
-This module is not designed to provide fine grained control over signal 
-handling. Nor is it intended to be terribly robust. It may give useful
-information when your program gets unexpected signals, but it might just
-as easily cause a crash when such a signal gets in. 

Copied: trunk/pyobjc/pyobjc-core/Doc/blocks.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/24blocks.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/24blocks.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/blocks.rst	Sun May  9 08:48:45 2010
@@ -6,7 +6,9 @@
 ------------
 
 Objective-C has the concept of "blocks", which are basically anonymous inline
-functions. The syntax for them is like this::
+functions. The syntax for them is like this:
+
+.. sourcecode:: objective-c
 
 	^{ printf("x is %d\n", 42); }
 
@@ -69,9 +71,11 @@
 
 If an argument or return value is a block the metadata should contain an "block_pointer"
 attribute, with a value of "true". The element then has subelements describing the 
-signature of block (excluding the implict block parameter). 
+signature of block (excluding the implicit block parameter). 
+
+As an example:
 
-As an example::
+.. sourcecode:: xml
 
    <arg index="0" block_pointer="true">
       <retval type="v" />

Copied: trunk/pyobjc/pyobjc-core/Doc/dev/coding-style.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/50coding-style.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/50coding-style.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/dev/coding-style.rst	Sun May  9 08:48:45 2010
@@ -1,6 +1,6 @@
-====================================
-(Developers) Coding style for PyObjC 
-====================================
+=======================
+Coding style for PyObjC 
+=======================
 
 :authors: Ronald Oussoren,
           Bill Bumgarner
@@ -8,8 +8,6 @@
 :URL: http://pyobjc.sourceforge.net/
 :copyright: 2002 The PyObjC Project
 
-.. contents::
-
 Introduction
 ------------
 

Copied: trunk/pyobjc/pyobjc-core/Doc/dev/structure.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/49structure.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/49structure.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/dev/structure.rst	Sun May  9 08:48:45 2010
@@ -1,6 +1,6 @@
-============================================
-(Developers) Structure of the PyObjC package
-============================================
+===============================
+Structure of the PyObjC package
+===============================
 
 Introduction
 ------------

Copied: trunk/pyobjc/pyobjc-core/Doc/dev/wrapping.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/54wrapping.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/54wrapping.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/dev/wrapping.rst	Sun May  9 08:48:45 2010
@@ -1,6 +1,6 @@
-=====================================================
-(Developers) How to wrap an Objective-C class library
-=====================================================
+========================================
+How to wrap an Objective-C class library
+========================================
 
 .. :author: Ronald Oussoren
 

Copied: trunk/pyobjc/pyobjc-core/Doc/fsref-fsspec.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/22fsref-fsspec.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/22fsref-fsspec.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/fsref-fsspec.rst	Sun May  9 08:48:45 2010
@@ -4,63 +4,60 @@
 PyObjC has its own wrappers for the types ``FSRef`` and ``FSSpec``, and also
 supports the wrappers for these types in ``Carbon.File``.
 
-Type ``objc.FSRef``
--------------------
+.. class:: objc.FSRef
 
-This type represents an opaque ``FSRef`` structure.
+    This type represents an opaque ``FSRef`` structure.
 
-New instances are created using the ``from_pathname`` method:
+    New instances are created using the ``from_pathname`` method:
+    .. sourcecode:: pycon
+    
+        >>> ref = objc.FSRef.from_pathname("/Libray")
+        >>> isinstance(ref, objc.FSRef)
+        True
+    
+    Instances of ``objc.FSRef`` are opaque and don't provide access to 
+    specific fields in the structure. The following methods and properties
+    are available to access an instance:
 
- .. sourcecode: pycon
+    .. attribute:: data
 
-   >>> ref = objc.FSRef.from_pathname("/Libray")
-   >>> isinstance(ref, objc.FSRef)
-   True
+        A bytestring containing the value of the ``FSRef`` object.
 
-Instances of ``objc.FSRef`` are opaque and don't provide access to 
-specific fields in the structure. The following methods and properties
-are available to access an instance:
+    .. method:: as_pathname
 
-* ``aref.data``
+        Returns the POSIX path for the ``FSRef`` object.
 
-  A bytestring containing the value of the ``FSRef`` object.
+    .. method:: as_carbon
 
-* ``aref.as_pathname()``
+        Returns a ``Carbon.File.FSRef`` instance for the ``FSRef`` object.
 
-  Returns the POSIX path for the ``FSRef`` object.
+        NOTE: This method is only available when ``Carbon`` support is
+        enabled in the Python build.
 
-* ``aref.as_carbon()``
+    NOTE: ``Carbon.File.FSRef`` instances can be used as the argument
+    of functions that have an ``FSRef`` structure as one of their
+    arguments.
 
-  Returns a ``Carbon.File.FSRef`` instance for the ``FSRef`` object.
+.. class:: objc.FSSpec
 
-  NOTE: This method is only available when ``Carbon`` support is
-  enabled in the Python build.
+    This type represents an opaque ``FSSpec`` structure. It is not possible
+    to create ``FSSpec`` instances in Python code.
 
-NOTE: ``Carbon.File.FSRef`` instances can be used as the argument
-of functions that have an ``FSRef`` structure as one of their
-arguments.
+    Instances of ``objc.FSSpec`` are opaque and don't provide access to 
+    specific fields in the structure. The following methods and properties
+    are available to access an instance:
 
-Type ``objc.FSSpec``
---------------------
+    .. attribute:: aref.data
 
-This type represents an opaque ``FSSpec`` structure. It is not possible
-to create ``FSSpec`` instances in Python code.
+        A bytestring containing the value of the ``FSRef`` object.
 
-Instances of ``objc.FSSpec`` are opaque and don't provide access to 
-specific fields in the structure. The following methods and properties
-are available to access an instance:
+    .. method:: aref.as_carbon
 
-* ``aref.data``
+        Returns a ``Carbon.File.FSRef`` instance for the ``FSRef`` object.
 
-  A bytestring containing the value of the ``FSRef`` object.
-
-* ``aref.as_carbon()``
-
-  Returns a ``Carbon.File.FSRef`` instance for the ``FSRef`` object.
-
-  NOTE: This method is only available when ``Carbon`` support is
-  enabled in the Python build.
-
-NOTE: ``Carbon.File.FSSpec`` instances can be used as the argument
-of functions that have an ``FSSpec`` structure as one of their
-arguments.
+        NOTE: This method is only available when ``Carbon`` support is
+        enabled in the Python build.
+    
+    NOTE: ``Carbon.File.FSSpec`` instances can be used as the argument
+    of functions that have an ``FSSpec`` structure as one of their
+    arguments.

Modified: trunk/pyobjc/pyobjc-core/Doc/index.rst
==============================================================================
--- trunk/pyobjc/pyobjc-core/Doc/index.rst	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/index.rst	Sun May  9 08:48:45 2010
@@ -12,8 +12,14 @@
    :maxdepth: 2
 
    intro
+   tutorials/index
    typemapping
+   protocols
+   fsref-fsspec
+   xcode
+   blocks
    lib/index
+   dev/index
 
 Indices and tables
 ==================

Modified: trunk/pyobjc/pyobjc-core/Doc/intro.rst
==============================================================================
--- trunk/pyobjc/pyobjc-core/Doc/intro.rst	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/intro.rst	Sun May  9 08:48:45 2010
@@ -7,9 +7,6 @@
 	:URL: http://pyobjc.sourceforge.net/
 	:copyright: 2003-2005 The PyObjC Project
 
-
-.. contents::
-
 Preface
 -------
 

Modified: trunk/pyobjc/pyobjc-core/Doc/lib/module-PyObjCTools.rst
==============================================================================
--- trunk/pyobjc/pyobjc-core/Doc/lib/module-PyObjCTools.rst	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/lib/module-PyObjCTools.rst	Sun May  9 08:48:45 2010
@@ -15,7 +15,8 @@
 .. toctree::
 
    module-PyObjCTools.KeyValueCoding.rst
-
-..   module-PyObjCTools.MachSignals.rst
+   module-PyObjCTools.AppHelper.rst
+   module-PyObjCTools.Conversion.rst
+   module-PyObjCTools.NibClassBuilder.rst
    module-PyObjCTools.Signals.rst
    module-PyObjCTools.TestSupport.rst

Copied: trunk/pyobjc/pyobjc-core/Doc/tutorials/embedded.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/07tutorial_embed/index.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/07tutorial_embed/index.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/tutorials/embedded.rst	Sun May  9 08:48:45 2010
@@ -33,6 +33,8 @@
 
 Follow these steps:
 
+.. note:: Before you start, download the :download:`reference source package <embedded_src.zip>` for this tutorial.
+
 1. Make a copy of ``/Developer/Examples/AppKit/SimpleComboBox`` to work on.
    Let's call this ``SimpleComboBoxPlus``:
 
@@ -58,14 +60,13 @@
    ``ITunesCommunication`` object.
     
 7. We now need to write the code implementing the ``ITunesCommunication``
-    class.  As this tutorial is about using PyObjC in existing ObjC programs
-    and not about PyObjC itself, we are going to skip writing the code and
-    simply copy ``ITunesCommunication_1.py`` to ``ITunesCommunication.py``.
+   class.  As this tutorial is about using PyObjC in existing ObjC programs
+   and not about PyObjC itself, we are going to skip writing the code and
+   simply copy ``ITunesCommunication_1.py`` to ``ITunesCommunication.py``.
 
 8. Now we need to create the build script for our plugin, create a file named
    ``setup.py`` with the following contents:
 
-
    .. sourcecode:: python
 
         from distutils.core import setup

Copied: trunk/pyobjc/pyobjc-core/Doc/tutorials/firstapp.rst (from r2348, /trunk/pyobjc/pyobjc-core/Doc/06tutorial/index.txt)
==============================================================================
--- /trunk/pyobjc/pyobjc-core/Doc/06tutorial/index.txt	(original)
+++ trunk/pyobjc/pyobjc-core/Doc/tutorials/firstapp.rst	Sun May  9 08:48:45 2010
@@ -28,11 +28,13 @@
 Getting Started
 ---------------
 
+.. note:: Before you start, download the :download:`reference source package <firstapp_src.zip>` for this tutorial.
+
 1. Create a work directory ``src``.  Check which Python you have installed
    PyObjC for, by running ``python`` and checking that ``import Foundation``
    works.  If it does not work it could be that you have installed PyObjC for
    ``/usr/local/bin/python`` but Apple's ``/usr/bin/python`` comes first in
-   your ``$PATH``.  Make sure you use the right python whereever it says
+   your ``$PATH``.  Make sure you use the right python wherever it says
    ``python`` in this tutorial.
    
 2. Start Interface Builder, select *Cocoa Application*
@@ -45,12 +47,11 @@
    ConverterController to the Interface", and stop at
    "*Implementing the Classes of Currency Converter*", as we are going to do
    this in Python, not Objective-C.  Your nib file should now be the same as
-   step3-MainMenu.nib_.
+   *step3-MainMenu.nib*.
    
 .. _`Developing Cocoa Objective-C Applications: a Tutorial`: http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCTutorial/index.html
 .. _`chapter 3`: http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCTutorial/index.html?http://developer.apple.com/documentation/Cocoa/Conceptual/ObjCTutorial/chapter03/chapter_3_section_1.html
-.. _step3-MainMenu.nib: step3-MainMenu.nib.zip
-   
+
 4. Create the skeleton Python script by running the ``nibclassbuilder`` script.
    ``nibclassbuilder`` will parse the NIB file and create a skeleton module for
    you.  Invoke it as follows (from the ``src`` directory):
@@ -66,10 +67,8 @@
 
        $ nibclassbuilder MainMenu.nib > CurrencyConverter.py
    
-   The result of this can be seen in step4-CurrencyConverter.py_.
+   The result of this can be seen in *step4-CurrencyConverter.py*.
 
-.. _step4-CurrencyConverter.py: step4-CurrencyConverter.py.html
-               
 Testing the user interface
 --------------------------
 
@@ -87,10 +86,8 @@
             data_files=['MainMenu.nib'],
         )
 
-   The result of this can be seen in step5-setup.py_.
+   The result of this can be seen in *step5-setup.py*.
 
-.. _step5-setup.py: step5-setup.py.html
-   
 6. Run the setup script to create a temporary application bundle for
    development:
 
@@ -118,7 +115,7 @@
    
         $ open dist/CurrencyConverter.app
        
-   - run it directly from the Terminal, as::
+   - run it directly from the Terminal, as:
 
      .. sourcecode:: sh
    
@@ -170,9 +167,7 @@
    more detail on this.
    
    The application should now be fully functional, try it.  The results of what
-   we have up to now can be seen in step8-CurrencyConverter.py_.
-   
-.. _step8-CurrencyConverter.py: step8-CurrencyConverter.py.html
+   we have up to now can be seen in *step8-CurrencyConverter.py*.
    
 Extending the functionality
 ---------------------------
@@ -247,9 +242,7 @@
     you try and invert an exchange rate of ``0``.
       
 12. Fix the final bug by testing for ``rate == 0.0`` in ``invertRate_()``.
-    The result is in the step12-src_ directory.
-    
-.. _step12-src: step12-src.zip
+    The result is in the *step12-src* directory.
    
 Creating a redistributable application
 --------------------------------------

------------------------------------------------------------------------------