Reverse detail from Kakelbont MS 1, a fifteenth-century French Psalter. This image is in the public domain. Daniel Paul O'Donnell

Forward to Navigation

Using normalize-space to fix Oxygen "pretty print" spacing problems

Posted: Jun 30, 2016 17:06;
Last Modified: Jun 30, 2016 17:06

Tags: , , ,


This is a straightforward thing for people who know what they are doing. It is only a reminder to me, who didn’t.

The journals I publish using TEI XML use the tei:figDesc element to populate the alt and title attributes of html:img.

Until today, these results in very odd looking tool tips, where the text was spread all over the place, e.g.

The problem was being caused by the OxygenXML editor’s pretty-print feature and how that was being transformed to the title and alt attributes. I was extracting the contents of the element and putting them on the attribute, this was not stripping the white space, meaning that the text showed up with strange spacing and returns.

The solution was very easy: surround the content-call with normalize-space(). Then everything worked fine. Here’s the relevant bit of XSLT:

<xsl:variable name="title">Click for full-sized image<xsl:if test="../tei:figDesc">
                        of <xsl:value-of select="../tei:figDesc"/></xsl:if></xsl:variable>
                <a href="{@url}" style="text-decoration:none;border:0px;">
                    <img alt="{../tei:figDesc}" src="{@url}" title="{normalize-space($title)}">
                        <xsl:call-template name="attcore"/>

Two tips that will improve the lives of all students and researchers in the Humanities and Social Sciences

Posted: Aug 16, 2014 13:08;
Last Modified: Aug 16, 2014 13:08

Tags: , , , , , ,



A recent question on Linked-in asked how important the formatting guides for journals are in preparing submissions.

Although this question was about submitting to journals, its context is relevant to all students and researchers in the Social Sciences and Humanities (although the problem also exists in the sciences, the solutions there are in some cases different). Humanities and Social Science study in University is largely about the collection of bibliography and the presentation of findings in written form. And that invariably involves questions of formatting: different disciplines and even different journals (or for students, instructors) within a discipline can require work to be submitted in quite different styles.


The bad old days

Twenty-five years ago, when I was an undergraduate, keeping track of and implementing these styles was a major problem: most students still typed their essays (some still even wrote them out by hand); and what wordprocessors there were were quite primitive (the first popular version of Windows, for example, and with it, the first really successful version of Word, came out the year after I went to Graduate School). Public library catalogues were still largely on paper or microfiche, and, most crucially, there was no World Wide Web.

In those days, ensuring your essay or article submission followed the correct format was a very time consuming task. And things got a lot worse if you needed to reformat something for submission elsewhere—e.g. sending a rejected article to a different journal or reformatting an essay for use as a dissertation chapter or to journal submission. Moreover, authors needed to know a number of different citation formats: APA, MLA, Harvard, and so on. There were few if any tools to help you automate this task (or if there were, I didn’t know about them). The only way of doing it accurately was to consult the relevant style guide and look for examples of the type of work you wanted to format (e.g. single-author mongraphs, chapters in edited collections, etc.).

Modern tools and practices

Things are a lot different today. Wordprocessors are much better and (free) tools exist to take care of your bibliographic management. If you still find yourself stressed by formatting tasks, it means you doing things wrong.

The next two posts will explain two basic practices and tools that anybody who works or studies the Social Sciences and Humanities should know about—and use if they would prefer to spend their time researching and writing rather than formatting their work.

The first post, on using wordprocessor styles, addresses the issue of formatting text for submission to instructors or journals for publication. It shows you how you can use the “style” function found in all popular contemporary wordprocessors to ensure consistency across the entire document: make sure all your headings are formatted the same way (or, if you have different levels of headings, that the headings at each level are formatted the same way); make sure that all block quotations have the same margins; that all paragraphs have the same first line indentations. And then change all of these across the entire document automatically and in seconds, if you discover that a particular instructor or journal wants things formatted differently.

The second post, on using citation managers, addresses the more specialised issue of collecting bibliography and formatting citations correctly. It shows you how a citation manager can take over this task almost entirely. Modern citation managers allow you to collect bibliography directly and automatically from library catalogues, many journal articles, and sites like (some even allow you to add books by photographing the barcodes on their dust jackets). They then integrate with your wordprocess to allow you to add citations as you write—they allow you to go through the material you have collected looking for the items you want and then, once you have found what you want, insert the citation into the text and bibliography of your essay at the click of a button. As with wordprocessor styles, moreover, citation managers also automatically handle the tediously detailed work of making sure your bibliographic entries conform to the format demanded by your instructor or journal: with a click of a button, you can change from APA to MLA to Chicago, or even, in some cases, design your own format.

Why you should care

Too many students and even professional researchers in the humanities and social sciences waste time doing unnecessary formatting tasks. By using wordprocessing styles and citation managers, it is possible to reduce the amount of effort these basic tasks require to almost nothing. If you are an advanced student or researcher, adopting these approaches will improve your efficiency several fold as soon as you can get used to the new way of working. This is especially true if you are working on a book or thesis that will involve maintaining consistency of format and citation style across a number of different chapters (in fact, if you are in that situation, I’d recommend stopping what you are doing and taking a couple of days to implement these right now—they improve things that much).

If you are just beginning your time as a university student, I recommend adopting them even more strongly: now is the time to get used to good habits that will save you time further down the road and you might be surprised how often you end up reusing citations and bibliography you acquire this year for the first time.


How to do a table of contents in text pattern

Posted: Feb 19, 2014 15:02;
Last Modified: Feb 19, 2014 16:02

Tags: , , ,


My teaching pages are served out using Textpattern, a relatively light CMS that uses textile wiki-like markup.

Because adding an excerpt by hand wrecks the syndication of this site through Wordpress to my other blog, I don’t usually add a text summary. Instead, I do something similar to the Wikipedia or Wordpress: I begin articles with an abstract like first paragraph, then include a table of contents, then have the rest of the body.

I used to make up these tables of content by hand, cursing all the time that Textile wasn’t XML. Then I discovered soo_toc, a Textpattern plugin that builds tables of contents dynamically. Joy!

Of course, now I need to remember to add the template that calls the TOC to each page (as I type this, I wonder if there might not be a simple variable I could develop that does this, but that’s for later). In the interests of remembering, here it is:

<div id="TOC">
   <txp:soo_toc label="Contents" labeltag="h3"/>

The only downside of this plugin is that you need to have IDs attached to every header you want to show up in the TOC. You add an ID in textpattern like this: h2(#IDREF). If you are in a rush, you can always just use (#A), (#B), (#C) (remember, IDREFs can’t start with a number in XML).


Mounting University of Lethbridge "P," "R," and "W" drives under Linux

Posted: Feb 19, 2014 14:02;
Last Modified: Jul 20, 2016 16:07

Tags: , , , , , , , , ,


Here’s how to mount “P” (Personal), “R” (shared research), “W” (web), and department/committee drives at the University of Lethbridge.


“P” drives

Your “P” drive is the windows share that represents your standard network desktop (i.e. the thing you see if you log into a classroom or other computer on campus).

The address is$USER where $USER is your account username (the same as the lefthand side of your uleth email account, or, in my case, daniel.odonnell.

ulhome is a CIFS drive. To mount it, you seem to have to use the commandline (I can’t seem to find the right protocol to use to use the GUI that comes with the file navigator in Ubuntu. I found instructions that worked for me here:

And, to solve the permissions problem that first arose,

One-time mount

To mount the drive by hand for a single session, do the following:

  1. Make sure cifs-utils is installed
  2. Choose a mount point. This can be an existing directory (if the directory has local content, it will not be available while the network drive is mounted). Or you can create a custom mount point. I did the latter: mkdir ~/ulhome
  3. Mount the remote drive. sudo mount -t cifs -o username=$USER,password=$PWORD,rw,nounix,iocharset=utf8,file_mode=0777,dir_mode=0777 //$REMOTEURL $MOUNTPOINT (where $USER = username; $PWORD = password; $REMOTEURL = url of CIFS drive; and $MOUNTPOINT = the directory you chose or created in step 2. Note: your IT department may not give you the full remote URL, since Windows can use the first part of the subdomain; at the U of L, for example, IT tell you the share is called \\ULHOME. I guessed it is probably in the University’s main domain and was correct: \\ULHOME is the same as //


To permanently mount the drive you need to create a password file and use that in /etc/fstab:

1. Create a file /root/.smbcredentials with the following content:


p.2. Change the permissions such that only root can read the file.
sudo chmod 700 /root/.smbcredentials

3. Now add the following line in /etc/fstab file.

//$REMOTEURL $MOUNTPOINT cifs default,uid=1000,gid=1000,credentials=/root/.smbcredentials,rw,nounix,iocharset=utf8,file_mode=0777,dir_mode=0777 0 0

nb: the default,uid=1000,gid=1000 part comes from This is to answer the problem of them mounting RO. When I tried this out, I then had to go into the directory on my local machine and manually change the permissions from access only to read and create.

4. Test if the line added in the fstab file works.

# sudo mount -a

5. Now the remote share should be mounted at /mnt/storage.

Your “R” drive

The “R” or research drive is a shared drive you can use for collaborative research projects. It is found at$DRIVENAME where $DRIVENAME is the name IT gives the space (e.g. genee_students).

You access this using smb (Microsoft’s workgroup protocol)

  1. In Nautilus, choose “Connect to Server”
  2. In the dialogue that pops up enter the network name, prefixed by the smb protocol (smb://$DRIVENAME).
  3. In the authentication dialogue, your username is your (full) uleth email address; password is the same as your uleth network password.
  4. That’s it.

Your “W” drive

The “W” or public drive (the drive your web files are on) is found at This can be ssh’d into and so is a lot easier to use.

ssh $

Department and committee drives

A third kind of drive is department and committee drives. These are often made by IT with spaces in the name (grrr). An example might be: cifs:// Committee

There are different ways of handling spaces in file names depending on how you are mounting things. For use from the commandline for one-off mounting, several normal options (e.g. \ , \040, and %20) don’t seem to work. What does seem to work is putting the whole directory with the space in quotation marks. So in the above example, the following works (where $USER is your uleth username) : sudo mount.cifs //"BoGRC Committee" BOG -o username=$USER


Yii Basic Steps

Posted: Apr 06, 2012 16:04;
Last Modified: May 23, 2012 18:05

Tags: , , , , ,


This is just a reminder to myself about setting up a Yii install. There are much more detailed examples on the web.

Build database

Build a database (I use MySql with innodb engine). The innodb engine is important because it allows you to document foreign key associations

Copy yii to top level of webdirectory

If you haven’t already done so, get a copy of the latest version of yii, uncompress it, and install it in a webdirectory immediately below the web root.

In my case, I tend to put it under /var/www/ and call the directory yii.

Use yiic to build initial site

navigate to the root of your web directory. Assuming yii is an immediate child of this directory, use the following to build the initial site of your website, where $site is the directory name you want to use for your site and $path the full path to the current directory:

yii/framework/yiic webapp $site

The response should be: Your application has been created successfully under $path/$site

Prepare for building the scaffolding

change directory to $path/$site/protected/config/

edit main.php:

  1. remove the comments surrounding the section on the gii tool (you’ll want to put these back in production)
  2. make sure you put a password in
  3. (for MySql) remove the comments surrounding the MySql Stanza and modify/supply the required information (usernames, passwords, servers, etc.)
  4. fix the admin email.

Use gii to establish the basic scaffolding

  1. point your webbrowser at the site (e.g. http://localhost/$site/ or$site/)
  2. click on the “home” link in the menubar to get the top URL (it will be something like this: http://$domain/$site/index.php?r=site/index)
  3. in the location bar, replace site/index with gii
  4. enter the database root password

Develop models

Most if not all dbases will have a model in the system.

  1. Select “Model Generator”.
  2. enter * in the “Table name” field to generate models for all tables; otherwise type the table name in the box for a specific table.
  3. click on preview.
  4. if everything is good, click on generate (need to make sure permissions all generation).

Develop CRUD

  1. select “crud generator”
  2. enter Model names for the models for which you want to have specific forms and actions (not all tables will require this: some will be written automatically or through relations)

Adding an attribute for title to a yii widget

Posted: Feb 24, 2012 15:02;
Last Modified: May 23, 2012 18:05

Tags: , , , , ,


The Yii file view.php by default uses the [zii.widgets.CDetailView] to display all examples of a given model. In the standard scaffolding produced by the gii utility, this widget consists of references to attributes of the model without any further information (e.g. attribute names and the like):

<?php $this->widget('zii.widgets.CDetailView', array(
		'journal.shortTitle', // a reference to a relational attribute
                'LastNamesFirstName', // a reference to a compound attribute

In this minimalist form, yii will calculate an appropriate label for the attribute on the basis of the attribute name: so, for example, in this case, editorialInstance_id will be appear in the view labelled “Editorial Instance” because Yii understands camelCase naming conventions and knows to strip off _id (it’s that good!).

A problem with this, however, is that we also provide customised label names as part of the attributeLabels() method in our Model controller. Since that method allows arbitrary names, and since CDetailView attempts to calculate labels on the basis of the attribute name, it is highly likely that the labels for different attributes will get out of synch in different places in your site. To give an example: in this particular case, the model for editorialInstance might have defined the label for editorialInstance_id as “ID” rather than “Editorial Instance”: since CDetailView doesn’t check to see what you had on attributeLabels() in the model class, switching from an edit view to an index will mean that the label of the attribute switches.

Ideally what you want to do is keep CDetailView and attributeLabels() in synch automatically. I’m sure there must be a way of doing this. In the meantime, however, here’s how you can set an arbitrary label in the widget (I’ve used it on the first and last):

<?php $this->widget('zii.widgets.CDetailView', array(
                array('value' => 
                      $model->editorialInstance_id, 'label' => 'ID'),
		array('value' => $model->person->lastNameFirstNames, 'label' => 'Person'),

Understanding Relation Models in Yii

Posted: Feb 24, 2012 13:02;
Last Modified: May 23, 2012 18:05

Tags: , , , , , ,


The core of any database driven website is its ability to handle table relations (if that sentence didn’t mean anything to you, you should first do some reading about relational databases, database design, and normalising data: an introduction aimed at textual editors can be found in my article “What digital editors can learn from
print editorial practice.” Literary and Linguistic Computing 24 (2009): 113-125)

One of the really useful things about the Yii MVC framework is the extent to which it allows you to systematise and automate the process of establishing these relations.

The relations() method

The most important part of this system is in the Yii model classes. When you first scaffold a new website in Yii (see the Yii website for the extremely easy to implement details of how this is done), the gii utility will build a series of standard model classes, each of which corresponds to a table in your database. A core method, included in every one of these models by default, is relations() (note: the following is how an empty relation method looks):

	 * @return array relational rules.
	public function relations()
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(

To indicate that the table represented by this model is related to other tables in your database, you construct a number of relation key => value pairs using a series of pre-defined terms (see these sections of the Yii Blog Tutorial and of the Yii documentation for details).

You can do this quite easily by hand. But if your database is designed using an engine that supports explicit information about relations (such as MySQL’s InnoDB engine [but not the default MYISAM]), Yii’s scaffolding utility gii will do much of the work in populating this method automatically.

Here’s an example of a relationset, built for a table in one of my databases (the model is called Journal and describes a table containing information about journals in a publishing workflow):

public function relations()
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'articles' => array(self::HAS_MANY, 'Article', 'journal_id'),
			'editorialInstances' => array(self::HAS_MANY, 'EditorialInstance', 'journal_id'),

In human terms, this is what the method is indicating:

  1. the journal table is directly related to two other tables in my database: article and editorialInstance (in my database, tables are named using camelCase starting with an initial lowercase letter; Yii’s naming convention is that Model Classes [i.e. the models that describe tables] begin with a capital letter: so Article is the model for the database table article).
  2. the relationship between journal and these two tables is
    1. parent to child (journal HAS article and editorialInstance)
    2. one to many (journal HASMANY_ article and editorialInstance
  3. the key names in the relations array article*s* and editorialInstance*s* are themselves arrays of all the possible values in these child tables
  4. both the child tables contain journal_id as a foreign key (FK)

How the relations() method makes your life easier

The great thing about this relations() method is that it turns relations into attributes of the model itself. That is to say, attributes of the related tables can be access directly from the model in which they are declared.

This is easiest to see with the BELONGS_TO (many-to-one child-to-parent) relation, which isn’t instanced above. Here’s an example from the EditorialInstance model, however: i.e. one of the children of Journal in my database:

public function relations()
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'journal' => array(self::BELONGS_TO, 'Journal', 'journal_id'),
			'person' => array(self::BELONGS_TO, 'Person', 'person_id'),

In this case, you can see tat EditorialInstance is the child of two databases (that is to say it BELONGS_TO them).

When a BELONGS_TO relationship is declared in a model, the attributes of the parent table are treated exactly like the attributes of the child table in the declaring model. I.e. let’s say the editorialInstance table has an attribute called type and we are referencing it like this in an editorialInstanceView: $data->type; we can also access all the attributes of the parent tables as well through this same model using language: so the lastName attribute on person would be referenced in this same context $data->person->lastName

Relational queries


Creating compound attributes in Yii

Posted: Feb 24, 2012 12:02;
Last Modified: May 23, 2012 18:05

Tags: , , , , , ,


Let’s say you have a database table called persons with separate attributes (fields) for lastName and firstNames. Elsewhere in your website, you want to refer to the underlying record in this table using the person’s whole name as a single entity (e.g. to provide a link, for example: <a href="">Jane Q. Public</a>.

Sometimes, you might be able to refer to the two attributes separately. For example, if you simply wanted to echo the content in a view somewhere you could use code like this:

<?php echo CHtml::encode($data->person->firstNames) . ' ' . CHtml::encode($data->person->lastName); ?>

This is a little inefficient if you are doing it a lot throughout your site, because you need to keep re-entering the same code correctly over and over again (and avoiding this is a main reason for going with an MVC framework like Yii in the first place). But the real trouble comes if you want to use the attributes in a context where the method you are invoking expects a single attribute—as is the case, for example, with the yii linking method CHtml::link.

The way round this is to create a new compound attribute in your model. This means taking the two underlying attributes in your table and combining them into a single attribute already arranged the way you want that you can then invoke in other methods. Or in this case, adding something like this to the Person model:

public function getFirstNamesLastName()
        return $this->firstNames . ' ' . $this->lastName;

Once this function is declared, you can invoke it, in exactly the same way you would have invoked the “original” attributes lastName or [firstNames], using the attribute name FirstNamesLastName: e.g.

array('person/view', 'id'=>$data->person->person_id)); ?>

(Note: there is a much more efficient way of encoding this last example using the same principle. See this post).


Yii Ensuring that key terms are always linked

Posted: Feb 24, 2012 11:02;
Last Modified: May 23, 2012 18:05

Tags: , , , , , ,


As we are building our workflow manager, we are discovering that we develop a more intuitive interface if some terms are always hyperlinked and point to a standard presentation of the relational information.

One example of this might be names of people associated with the workflow (editors, authors, copyeditors, production assistants). An intuitive internal navigation method seems to be to have the names of these people always hyperlinked with the hyperlink always pointing to the person’s profile page.

One way of doing this in Yii would be to modify the views associated with each table in the site so that every time a name is called, you get a link. This is contrary to spirit of the MVC model, however, since it means you are using a view to present logic about the underlying model. And it is also prone to error, since it means you a) need to find every possible invocation of the name in all you various views and b) not make an error as you enter the same code over an over again in all these different views.

The better approach is to add this functionality to the underlying datamodel that supplies the information to the entire site in the first place—that is, to the model for the database that is providing the name information and the page you want to link to in the end.

Here’s some code for your model that would allow you produce a linked name anywhere in your yii site (for simplicity’s sake in this example, I am wrapping a single attribute from my database in a hyperlink. This post shows you how to use a similar method to first make compound attributes):

public function getLastNameLink()
    return CHtml::link(CHtml::encode($this->lastName),
    array('person/view', 'id'=>$this->person_id));

Here are some underlying premises behind this code:

  1. There is a table in my database called person
  2. I have written a view for this database (either by hand or using the gii utility to build one automatically): person/view is the URL fragment CHtml::link will use to build the link to the profile page for a given person (note: it is tempting to just use view for the URL because we are already in the person model; you should use the “full” yii-path however because you will be invoking this throughout the site from views associated with all sorts of other models)
  3. The table person has an attribute (column) called person_id.

Once this has been added to my Person model, I can call the code (and add a link to the person profile) in any view by just invoking the method: from now on, the LastNameLink functions as an attribute of the Person model and can be used in exactly the same way actual direct, table-based attributes can be invoked. For example, in a different model’s view:

<?php echo $data->person->LastNameLink; ?>

This code will produce a link to index.php?r=person/view&id=n where n is the id number of a given record in the table. If I hadn’t added the above code to the Person model, the code required to do the equivalent would have been:

<?php echo 
array('person/view', 'id'=>$data->person->person_id)); ?>

Yii Authentication

Posted: Feb 19, 2012 23:02;
Last Modified: May 23, 2012 18:05

Tags: , , ,


admin authentication

In the controllers established by gii, yii’s scaffolding tool, there is a standard method called accessRules() that defines what users can do what actions. A common set is:

public function accessRules()
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
			array('deny',  // deny all users

The comments explain what each array means. An interesting question, however, is how you get a user to count as an ‘admin’? Is there some method or class somewhere that store this information? And if so, how do I get in it?

If you create new users you might devote considerable amount of time trying to get them into the admin class, all to no avail. As far as I can tell, the ‘admin’ refers to usernames rather than a class of user. So if your username is ‘admin’ you can do the restricted actions. If it isn’t, you can’t.

There are a couple of choices here. One is to keep a user whose name is ‘admin’: this has the virtue of simplicity and, since yii will always generate this condition everytime you generate a new site, it also means you’ll not have to go changing ever constructor in your new site as well.

The other choices are to change the code, either to allow some other determinant there. One approach, modified very slightly from an example in Larry Ullman’s blog, is to change ‘admin’ to the wildcard '<nowiki>‘@ (=logged in users) and then add an expression for some other condition:

    'expression'=>'isset($user->role) && ($user->role==="editor")'

You could even just hardwire somebody’s name in or some other attribute:

bc.. array('allow',
    'expression'=>'isset($user->email) && ($user->role==="")'

For more discussion, see


set date and time from commandzone

Posted: Nov 22, 2011 21:11;
Last Modified: Jun 07, 2012 13:06

Tags: , , ,



Extracting a catalogue of element names from a collection of XML documents using XSLT 2.0

Posted: Sep 15, 2011 17:09;
Last Modified: May 23, 2012 19:05

Tags: , , , , , ,


We are trying to build a single stylesheet to work with the documents of two independent journals. In order to get a sense of the work involved, we wanted to create a catalogue of all elements used in the published articles. This means loading as input document directories’ worth of files and then going through extracting and sorting the elements across all the input documents.

Here’s the stylesheet that did it for us. It is probably not maximally optimised, but it currently does what we need. Any suggestions for improvements would be gratefully received.

Some notes:

  1. Our goal was to pre-build some templates for use in a stylesheet, so we formatted the elements names into xsl templates.
  2. Although you need to use this sheet with an input document, the input document is not actually transformed (the files we are extracting the element names from are loaded using the collection() function). So it doesn’t matter what the input document is as long as it is valid XML (we used the stylesheet itself)
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="" version="2.0">

<!-- this output is because we are going to construct 
ready-made templates for each element -->
    <xsl:output method="text"/>

<!-- for pretty printing -->
    <xsl:variable name="newline">

<!-- Load the files 
in the relevant directories -->
    <xsl:variable name="allFiles"

<!-- Dump their content into a single big pile -->
    <xsl:variable name="everything">
        <xsl:copy-of select="$allFiles"/>

<!-- Build a key for all elements using their name -->
    <xsl:key name="elements" match="*" use="name()"/>

<!-- Match the root node of the input document
(since the files we are actually working on have been 
loaded using the using the collection() function, nothing 
is actually going to happen to this element) -->
    <xsl:template match="/">

       <!-- this is information required to turn the output into an 
              XSL stylesheet itself -->
        <xsl:text>&lt;xsl:stylesheet xmlns:xsl=""
        <xsl:value-of select="$newline"/>
        <xsl:text>&lt;!--Summary of Elements --&gt;</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>

       <!-- this invokes the collection of all elements in all the files
       in the directory for further processing -->
        <xsl:for-each select="$everything">

           <!-- This makes sure we are dealing with the first named key -->

               <!-- sort them -->
                <xsl:sort select="name()"/>

                <xsl:for-each select="key('elements', name())">

                   <!-- this makes sure that only the first instance 
                    of each element name is outputted -->
                    <xsl:if test="position()=1">
                        <xsl:text>&lt;xsl:template match="</xsl:text>
                        <xsl:value-of select="name()"/>
                        <xsl:text>"> </xsl:text>
                        <xsl:value-of select="$newline"/>
                        <!-- this counts the remaining occurences -->
                        <xsl:value-of select="count(//*[name()=name(current())])"/>
                        <xsl:text> occurences</xsl:text>
                        <xsl:value-of select="$newline"/>
                        <xsl:value-of select="$newline"/>
                        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>

How to "clone" a test in Moodle 2.0

Posted: Mar 27, 2011 21:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , ,


Here’s how to clone a test in Moodle 2.0 (i.e. make an exact copy so that both appear in the course; this is useful for making practice tests or copying a basic test format so that it can be reused later in the course):

  1. Backup the test. Exclude all user data but include activities, blocks, and filters.
  2. Select “Restore.” Your backup should be listed under user private backups. Simply restore the file to create a second instance.
  3. Treat one of the instances as your clone: move it, edit it, change its titles and questions. It is a completely independent version of the original file.

Organising Quizzes in Moodle 2.0

Posted: Mar 27, 2011 21:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , ,


Moodle 2.0 allows designers to divide questions into pages. But while this introduces great flexibility, it can be quite a cumbersome system to use at first. Here’s a method for making it more efficient:

  1. When you first build a test, put all questions on one page.
  2. Once you have the questions in the order you want, divide the test into different pages by selecting the last question for each page and selecting the “Begin new page after selected question.

This will cut down on your server calls (and hence time) immensely.


Differences between Moodle and Blackboard/WebCT short answer questions

Posted: Mar 27, 2011 20:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , , , , ,


There is an important difference between Moodle and Blackboard (WebCT) short answer questions that instructors should be aware of, namely that Moodle short answer questions allow only one answer field.

This means, for example, that you can’t easily import blackboard questions of the type “Supply the part of speech, person, tense, and number for the following form.” In Blackboard, you can present the student with four blanks for them to fill in, each with a different answer. When these are imported into Moodle, the question is converted into a form in which there is a single blank that has four possible correct answers.

There are various ways of asking the same kinds of questions in Moodle. The easiest when you are dealing with imported questions is to ask for a single quality in each answer. So instead of one question asking for part of speech, person, tense, and number, you might have four different questions, one for part of speech, another, for person, a third for tense, and a fourth for number.

A second way of asking this kind of question in Moodle is to use the embedded answer type. These are harder to write, but are arguably closer to the paper equivalent of the same type of question:

For the following Old English word supply the requested information:


Part of Speech: ____________
Tense: ____________
Number: ____________


Multiple Choice Questions in Moodle

Posted: Mar 27, 2011 18:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , ,


Here are some tips for the composition of Multiple Choice Questions in Moodle.

  1. If students are allowed to mark more than one option correct and you intend to include at least one question where none of the offered options are correct, include as a possible answer “None of the listed options.”
    1. Do not call it “none of the above” since if (as you normally should) you have selected “shuffle answers,” you have no guarantee that it will be the final answer in the sequence.
    2. You should include this option in all questions in the set (including those for which some of the options are correct) to avoid giving the answer away when it appears.
    3. When “none of the listed options” is not the right answer, it should be scored at -100%, to avoid a student hedging his or her bets by selecting it and all the other answers.
  2. If you anticipate having a question for which all the answers are correct, you do not need a “All of the listed answers,” since selecting all will give students 100%.
  3. The correct options should be scored so they add up to 100%, of course!
  4. Incorrect options (exclusive of other than “None of the listed forms”) can be scored in a number of different ways:
    1. So that the total for all incorrect options (except “none of the listed forms”) is -100% (this stops a student hedging his or her bets by selecting all options); if you do not have a “none of the listed options” answer, you almost certainly should score this way.
    2. So that each negative is the reciprocal of a correct answer, regardless of whether all the incorrect answers add up to -100%. Use this if you don’t mind that a student selecting everything except a “None of the listed options” might end up with part marks.

How to build a randomised essay/translation question in Moodle 2.0

Posted: Mar 20, 2011 16:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , ,


In my courses I often use a question of the following format:

  1. Common introduction
  2. Two or more sample passages or questions requiring an essay response
  3. A common form field for the answer to the student’s choice from #2.

Here is an example:

Write a modern English translation of one of the following passages in Old English in the space provided below.

1. Hæfst þū ǣnige ġefēran?
2. Hwæt māre dēst þū? Hæfst þū ġīet māre tō dōnne?

[Essay answer box for translation].

The point of this format is to provide the student with a choice of topics. If students all write their essays or translations at the same time, you can build your choice of topics by hand and write them into a single question. The challenge comes if you want to be able to allow your students to write the test asynchronously, as is common with Learning Management Software. In such cases you want to be able to draw your essay topics or translation passages randomly from a test bank.

All the basic elements you would need to do this are available in Moodle, both 1.x and 2.0+. You can use the “description” question type to put in the general instructions at the beginning; you can use the essay format question to provide the answer box. And you can use Moodle’s ability to assign random questions to draw your topics or translation passage from your test bank.

But there are also some problems:

  1. Description questions are unnumbered, meaning your introduction will not start with the question number
  2. Although there was some discussion before the release of Moodle 2.0 about allowing description questions to be randomised, this appears not to have been implemented. All questions that can be randomised must have an action associated with them. This means that every topic or translation passage must ask the student to do something. And also that each topic or translation will have a number.

What I do is the following:

  1. I write the introduction as a description question (and just accept that it has no number assigned).
  2. I write my translation passage or topics as “true / false” questions. Each consists of the topic or passage, followed by the question “I am writing on this topic/passage…” as the prompt for a true/false answer.
  3. I use the essay topic question to provide the common answer box. Since you need to have some text in an essay question, I use an anodyne instruction like “Write your essay/translation in the following space” to fill out the question.
  4. I assign a grade value of 0 to the two random topic/passages and assign the full grade value of the question to the essay answer box. The result is not elegant, but it works.

Manual Grading of All Questions in Moodle 2.0

Posted: Mar 20, 2011 11:03;
Last Modified: Mar 04, 2015 05:03

Tags: , , , , , , ,

  1. From the main course page, select the quiz.
  2. From the quiz page, scroll down until you see the number of attempts made this should be a hyperlink.
  3. Select the hyperlink; you will now see a table of results. In the navigation block in the left hand frame select My home > My courses > [course name] > [Week or topic in which quiz is found] > Results > Manual Grading
  4. When you select this you are presented with the questions for manual grading. New in Moodle 2.0 is the option of hiding names and pictures; unfortunately this doesn’t affect the actual presentation of names under the “mark all instances” page.

How to setup a signup sheet in Moodle

Posted: Mar 15, 2011 14:03;
Last Modified: May 23, 2012 19:05

Tags: , , , , , , ,


You can create a signup sheet for Moodle using the “Choice” activity.

A video showing how to do this can be found here:

In brief, however, here’s how to do it:

  1. Go to the section of your course in which you want the signup sheet to appear.
  2. With editing on, select the “Choice” activity.
  3. Fill in the title and description information.
  4. If you are restricting attendance, set the “Limit the number of responses allowed” option under “Limit” to “enabled.” Setting this allowed you to set how many people are allowed to choice any one option. If it is disabled, any number of participants may sign up for any particular session.
  5. Each “Option” represents an entry on the signup sheet. Write in the date and time (or anything else you require) in the “Option” field and, if you have enabled limits, the maximum number of participants for the entry in the “limit” field. If you need more than the standard five options, select “Add three more options” after you’ve filled in the first five.

How to do stuff in Moodle

Posted: Mar 15, 2011 12:03;
Last Modified: Mar 04, 2015 05:03

Tags: , , , , ,


Here’s a very good site at Furman University for common, specific tasks in Moodle:


Developing complex arguments

Posted: Nov 16, 2010 13:11;
Last Modified: Mar 04, 2015 05:03

Tags: , , , , , ,


This is an exercise intended to give students techniques in developing complex literary theses. The problem it addresses is the tendency many students have to argue the obvious: either argue that the plot unfolds the way it does or that certain fairly obvious topics and themes are present in a work. It probably works best at the beginning of a unit on a given work, before any lectures or other directed discussion.

  1. Put the students in groups of 4 or 5.
  2. Ask the students for the most striking things they saw in the work: what it was about, any obvious themes, striking things about the characters, striking events or speeches. In a recent discussion of O’Neill’s Long Day’s Journey into Night we came up with things like: the play takes place in a day; all the main characters show an addiction to something; the family seems to be very disfunctional; there is no resolution—they sound like they’ve been having this argument forever.
  3. Take a couple of these observations either simultaneously (assigned each to a different group) or collectively (each handled by all the groups in turn) and ask the group to argue the opposite of the observation—in the case of O’Neill’s play, for example, that it is wrong to see the play as taking place all in one day, or that the familiy isn’t disfunctional, or alcohol and drugs aren’t the problem in the story. In constructing their arguments, the groups need to observe the following rules:
    1. They can’t deny actual facts: so you can’t argue, for example, that the characters in Long Day’s Journey into Night are only hallucinating that it is a single day.
    2. They can’t use “might be” or “could be”: all arguments need to be demonstrable textually.
  4. As usual, go round the groups asking for arguments and evidence. Ask other groups for ways of expanding, improving, or contradicting proposals.

Developing Essay Topics in Class

Posted: Oct 07, 2010 17:10;
Last Modified: Mar 04, 2015 05:03

Tags: , , , , , ,


This is a method I use with some success to develop essay topics collectively, in-class.

  1. Ask each student in the class to prepare in advance an essay topic that would be helpful to somebody else in the class.
  2. On the class day, divide the class into groups of four and ask each group to review all the members’ topics.
    1. Optional: before asking the class to discuss the topics amongst themselves, ask them about essay topics they have had in the past that have worked or not. Try to build a sense of what types of topics exist and what makes for a good (and bad) topic. If discussion falters, ask the groups to come up with something.
  3. After reviewing and discussing the topics amongst themselves, each group is to come up with a single essay topic for the rest of the class. This can be based on one of the four proposals, modified from a proposal, or completely new based on their discussions.
  4. Go through each of the groups in turn, asking to hear what their best topic is. Write up the topic on the board.
  5. After all groups have been heard from, go back through the topics, this time asking others to comment on strengths, weaknesses, ways of extending the topic, focussing it, etc.
  6. At the end of the exercise ask each group to nominate a secretary, whose job it is to mail a single topic to the class based on their group’s proposal and the commentary they received.

Active Pedagogy and University English

Posted: Aug 17, 2010 16:08;
Last Modified: Mar 04, 2015 05:03

Tags: , , , ,


For the last four or five years, I’ve been investigating ways of changing my teaching.

Like most faculty of my generation, I learned to teach largely by imitation and guesswork. I mimicked the teachers and classes I enjoyed as a student and otherwise experimented with techniques and ideas grabbed magpie-like from various sources.

Early on as a teaching assistant at Yale, for example, I learned that it was wrong to approach a discussion section with too much worked out in advance. I’d begun there by approaching sections much like an essay, with a developed thesis and arguments; even after dropping the thesis, I still found planning too much tended to squelch discussion. I soon ended up more-or-less self-consciously modelling my discussion sections on the panel discussion on the old McNeil-Lehrer Newshour (Now PBS Newshour): like the reporters who hosted those discussions, I saw my role as being largely facilitating the discussion by summarising points made by one person in the discussion and handing them off to others for comment.

This worked well at Yale, and, as I was recently reminded during a PhD seminar in Digital Anglo-Saxon studies at Memorial, is probably generally a good approach with highly motivated students who already have a sense of how literary scholarship works.

It works less well with students who don’t have a natural sense for what is interesting and appropriate in critical discussions or who have yet to develop experience in that kind of debate. While the “guided reflection” style does still work well for me in some situations, I’ve been really disturbed in recent years by how many students seem to have a difficult time understanding what the point of a literary discussion is or why discussion should be central to a literary class. Unfortunately, since most of my instructors seemed to assume we did have this innate knowledge or experience, the models I’d copied until now were of little use in overcoming this problem: as much as I loved and benefited from these approaches as a student, it is clear that for a lot of the students I now teach, the method is more of a help than a hindrance.

Addressing the problem is something that has occupied my thought (or at least the time I devote to thinking about teaching) for quite some time. An initial improvement came when I discovered constructivist pedagogical theory. While what I was doing was broadly (and naively) speaking constructivist in intent, reading formally constructivist guides to theory and practice allowed me to think about what I was doing meta-pedagogically and caused me to introduce some new ideas to my practice that I hadn’t seen in my own instructors’ practice. The most significant of these was realising the difference between formative and summative evaluation. I quickly introduced assignments and exercises into my classes that were intended to function in a primarily formative way—often with grading that allowed students to include only their best or favourite pieces of work in their final grades. I started allowing students access to their (on-line) exams to eliminate question bias and anxiety. I tried very hard to introduce opportunities for self-testing and self-directed exercises and practice material. And I worked very hard at explaining the purpose behind various assignments.

While some of these changes introduced improvements in the class, I still did not feel I was getting the results I wanted. In particular, I still found a pervasive lack of comprehension concerning the importance of class discussion, class presentations, and essays in a literary class. And I still got complaints on student evaluations asking me to lecture more.

In the last year, I’ve been reading more about “Active” learning and teaching—really a kind of approach to constructive teaching as far as I can see. This is a type of pedagogy that focusses on methods for getting students to engage in “deep” learning, or learning that involves the students’ own curiosity and active participation in developing an understanding of the material they are studying. This involves attempting to keep the class focus on formative evaluation rather than summative. Focus too much on summative evaluation and you find that students begin to engage in “Surface” learning—engaging in strategies designed to maximise their grades rather than their knowledge. But it also goes beyond that and attempts to find ways of encouraging students to learn by internalising the lessons—bringing their previous knowledge and experience to bear on the subject or problem and learning by modifying, supplementing, or replacing their previous knowledge of the subject. Active learning involves students wanting to learn and seeing their learning as something internal to their development as human beings rather than participants in a course.

This is of course what I hoped (largely unsuccessfully) that my students were doing in the methods that I imitated from my professors. The new things for me in reading about explicit approaches to actually carrying this off successfully with my own students were the range of techniques and exercises that have been explicitly developed for encouraging this kind of learning in students and, in more practical works, the understanding of what (many) students do and don’t know when they come into the University classroom (as the child of Physicist and a faculty member myself as an adult, I’ve lived my entire life in and around universities and at least viscerally as a participant in scholarly discussion and debate—the result is that I don’t think I’ve ever experienced the kind of uncertainty how academia works many Active Learning researchers suggest is endemic in the first year classroom).

Two sites and one book in particular have been extremely helpful to me over the course of the last year in developing new teaching techniques:

The two websites in particular have a wealth of “recipe-like” proposals for exercises one can use in the classroom in order to promote the kind of reflexive and deep learning all faculty ultimately want to produce. They can seem a little “teachery” to somebody like myself who, I am realising, is very much a pedagogical conservative. And I’m not 100% sure I would have liked having them in classes taught by the professors who taught me, since one of the things I loved about University was that it involved getting away from “worksheets” and starting to learn directly at (what I at least thought was) the academic coal face itself. But since most students nowadays seem to want to be “taught by” rather than “study with” their professors, perhaps the problem thus far has been worrying too much about what I’d have liked if I were still a student ;)


Using Oxygen and Subversion client

Posted: Aug 20, 2008 15:08;
Last Modified: May 23, 2012 18:05

Tags: , , , , , , ,


Here are instructions for using Oxygen for accessing the Littlechief Project Subversion server.

1) Open Oxygen. It should looks something like this (if you’ve used it before there may be files loaded already in the main window):

2) Select Tools then SVN Client in order to open the SVN Client. You should then be presented with a screen that looks something like this:

3) The two panels we need to use are in the top and bottom left (Repositories and Working Copy). In Repositories we will place the address of our SVN client; in Working Copies we will put the directory on our local machine (i.e. the computer we are using) where we want the files to be stored.

a) Check if the SVN repository address for the Littlechief project is listed as it is here:

If it isn’t, install the repository by selecting Repository > New Repository Location. You will be presented with a small dialogue like this:

Enter the repository address you have received separately in the blank and click O.K.

b) Check that the working directory you wish to use is loaded in the bottom left panel.

If it isn’t, add a new working directory by selecting Repository and then Check Out. A working directory dialogue like this will open:

Browse to an appropriate directory or create a new folder for the repository. Click on O.K. and Oxygen will start downloading the files to your local machine.

4) To edit a document in Oxygen, select the file you want in the “working directory” panel in SVN Client (bottom left—all our working xml files are in the folder 3_workingXML). Right click on the file and select “Open in Oxygen”:

Normally Oxygen will then pop up on your screen with the file loaded. If it doesn’t, select Oxygen from the file chooser bar (along the bottom of the desktop in Windows).


O Captain! My Captain! Using Technology to Guide Readers Through an Electronic Edition

Posted: Dec 15, 2006 16:12;
Last Modified: May 23, 2012 20:05

Tags: , , , , ,


Original Publication Information: Heroic Age 8 (2005).

O CAPTAIN! my Captain! our fearful trip is done;
The ship has weather’d every rack, the prize we sought is won;
The port is near, the bells I hear, the people all exulting,
While follow eyes the steady keel, the vessel grim and daring:
  But O heart! heart! heart!
    O the bleeding drops of red,
      Where on the deck my Captain lies,
        Fallen cold and dead.

Walt Whitman, Leaves of Grass

Digital vs. Print editions

§1. Most theoretical discussions of electronic editing attribute two main advantages to the digital medium over print: interactivity and the ability to transcend the physical limitations of the page1. From a production standpoint, printed books are static, linearly organised, and physically limited. With a few expensive or unwieldy exceptions, their content is bound in a fixed, unchangeable order, and required to fit on standard-sized, two dimensional pages. Readers cannot customise the physical order in which information is presented to them, and authors are restricted in the type of material they can reproduce to that which can be presented within the physical confines of the printed page2.

§2. Electronic editions, in contrast, offer readers and authors far greater flexibility. Content can be reorganised on demand in response to changing user needs through the use of links, search programs, and other utilities. The physical limitations of the screen can be overcome in part through the intelligent use of scrolling, dynamically generated content, frames, and other conventions of the electronic medium. The ability to organise and present non-textual material, indeed, has expanded the scope of the edition itself: it is becoming increasingly possible to edit physical objects and intellectual concepts as easily as literary or historical texts.

§3. Not surprisingly, this greater flexibility has encouraged electronic editors to experiment with the conventions of their genre. As McGann has argued, the traditional print-based critical edition is a machine of knowledge (McGann 1995). Its conventions developed over several centuries in response to a complex interplay of intellectual pressures imposed by the requirements of its subject and technical pressures imposed by requirements of its form:

Scholarly editions comprise the most fundamental tools in literary studies. Their development came in response to the complexity of literary works, especially those that had evolved through a long historical process (as one sees in the bible, Homer, the plays of Shakespeare). To deal with these works, scholars invented an array of ingenious machines: facsimile editions, critical editions, editions with elaborate notes and contextual materials for clarifying a work’s meaning. The limits of the book determined the development of the structural forms of these different mechanisms; those limits also necessitated the periodic recreation of new editions as relevant materials appeared or disappeared, or as new interests arose.

With the elimination of (many) traditional constraints faced by their print predecessors, electronic editors have been free to reconceive the intellectual organisation of their work. The ability to construct electronic documents dynamically and interactively has allowed editors to reflect contemporary doubts about the validity of the definitive critical text. Cheap digital photography and the ability to include sound and video clips has encouraged them to provide far more contextual information than was ever possible in print. With the judicious use of animation, virtual reality, and other digital effects, electronic editions are now able to recreate the experience of medieval textuality in ways impossible to imagine in traditional print editions.

Print Convention vs. Electronic Innovation

§4. The increased freedom enjoyed by electronic editors has brought with it increased responsibility. Because they work in a well established and highly standardised tradition, print-based editors are able to take most organisational aspects of their editions for granted. With some minor variation, print-based textual editions are highly predictable in the elements they contain, the order in which these elements are arranged, and they way in which they are laid out on the page (for examples and facsimiles of the major types, see Greetham 1994). In print editions, the textual introduction always appears before the critical text; the apparatus criticus always appears at the bottom of the page or after the main editorial text; glossaries, when they appear, are part of the back matter; contextual information about witnesses or the literary background to the text appears in the introduction. Publishers commonly require these elements to be laid out in a house style; beginning editors can look up the required elements in one of several standard studies (e.g. Greetham 1994, West 1973, Willis 1972).

§5. No such standardisation exists for the electronic editor (Robinson 2005)3. Few if any publishing houses have a strong house style for electronic texts, and, apart from a sense that electronic editions should include high quality colour images of all known witnesses, there are, as yet, few required elements. Electronic editions have been published over the last several years without textual introductions (Kiernan 1999), without critical texts (Solopova 2000), without a traditional textual apparatus (De Smedt and Vanhoutte 2000), and without glossaries (Adams et al. 2000)4. There are few standards for mise en page: some editions attempt to fit as much as possible into a single frameset (Slade 2002); others require users to navigate between different documents or browser tabs (Stolz 2003). Facsimiles can appear within the browser window or in specialised imaging software (cf. McGillivray 1997 vs. Adams et al. 2000): there are as yet few universally observed standards for image resolution, post-processing, or file formats. User interfaces differ, almost invariably, from edition to edition, even among texts issued by the same project or press (cf. Bordalejo 2003 vs. Solopova 2000). Where readers of print editions can expect different texts to operate in an approximately similar fashion, readers approaching new electronic texts for the first time cannot expect their text’s operation to agree with that of other editions they have consulted5.

Technology for Technology’s Sake?

§6. The danger this freedom brings is the temptation towards novelty for novelty’s sake. Freed largely from the constraints of pre-existing convention, electronic editors can be tempted to towards technological innovations that detract from the scholarly usefulness of their projects.

Turning the Page (British Library)

§7. Some innovations can be more annoying than harmful. The British Library Turning the Pages, series, for example, allows readers to mimic the action of turning pages in a manuscript facsimile ( When users click on the top or bottom corner of the manuscript page and drag the cursor to the opposite side of the book, they are presented with an animation showing the page being turned over. If they release the mouse button before the page has been pulled approximately 40% of the way across the visible page spread, virtual gravity takes over and the page falls back into its original position.

§8. This is an amusing animation, and well suited to its intended purpose as an interactive program that allows museums and libraries to give members of the public access to precious books while keeping the originals safely under glass ( Scholars interested in the texts as research objects, however, are likely to find the system less attractive. The page-turning system uses an immense amount of memory—the British Library estimates up to 1 GB of RAM for high quality images (—and the requirement that users drag pages across the screen makes paging through an edition a time- and attention-consuming activity: having performed an action that indicates that they wish an event to occur (clicking on the page in question), users are then required to perform additional complex actions (holding the mouse button down while dragging the page across the screen) in order to effect the desired result. What was initially amusing rapidly becomes a major and unnecessary irritation.

A Wheel of Memory: The Hereford Mappamundi (Reed Kline 2001)

§9. Other innovations can be more harmful to the intellectual usefulness of a given project. A Wheel of Memory: The Hereford Mappamundi uses the Mappamundi as a conceit for the exploration of the medieval collective memory… using our own collective rota of knowledge, the CD-ROM (Reed Kline 2001, I audio). The edition has extremely high production values. It contains original music and professional narration. Images from the map6 and associated documents are displayed in a custom-designed viewing area that is itself in part a rota. Editorial material is arranged as a series of chapters and thematically organised explorations of different medieval Worlds: World of the Animals, World of the Strange Races, World of Alexander the Great, etc. With the exception of four numbered chapters, the edition makes heavy use of the possibilities for non-linear browsing inherent in the digital medium to organise its more than 1000 text and image files.

§10. In this case, however, the project’s innovative organisation and high production values are ultimately self-defeating.!(left)| Despite its heavy reliance on a non-linear structural conceit, the edition itself is next to impossible to use or navigate in ways not anticipated by the project designers. Text and narration are keyed to specific elements of the map and edition and vanish if the user strays from the relevant hotspot: because of this close integration of text and image, it is impossible to compare text written about one area of the map with a facsimile of another. The facsimile of the map itself is also very difficult to study. The customised viewing area is of a fixed size (I estimate approximately 615×460 pixels) with more than half this surface given over to background and navigation: when the user chooses to view the whole map on screen, the 4 foot wide original is reproduced with a diameter of less than 350 pixels (approximately 1/10 actual size). Even then, it remains impossible to display the map in its entirety: in keeping with the project’s rota conceit, the facsimile viewing area is circular, even though the Hereford map itself is pentagonal: try as I might, I was unable ever to get a clear view of the border and image in the facsimile’s top corner.

Using Technology to Transcend Print

§11. The problem with the British Library and Hereford editions is not that they use innovative technology to produce unconventional editions. Rather, it is that they use this innovative technology primarily for effect rather than as a means of contributing something essential to the presentation of the underlying artifact. In both cases this results in editions that are superficially attractive, but unsuited to repeated use or serious study7. The British Library facsimiles lose nothing if the user turns off the “Turning the Page” technology (indeed, in the on-line version, an accessibility option allows users precisely this possibility); leaving the technology on comes at the cost of usability and memory. In the case of the Hereford Mappamundi, the emphasis on the rota navigational conceit and the project’s high production values get in the way of the map itself: the use of the round viewing area and fixed-width browser actually prevents the user from exploring the entire map, while the close integration of text, narration, and images ironically binds readers more closely to the editor’s view of her material than would be possible in a print edition.

Bayeux Tapestry (Foys 2003)

§12. Appropriately used, innovative technology can create editions that transcend the possibilities of print, however. This can be seen in the third edition discussed in this paper, The Bayeux Tapestry: Digital Edition8.

§13. On the one hand, the Bayeux Tapestry edition uses technology in ways that, at first glance, seem very similar to the Hereford Mappamundi and British Library facsimiles. Like the Mappamundi project, the Bayeux edition has very high production values and is presented using a custom-designed user interface (indeed, the Hereford and Bayeux projects both use the same Macromedia presentation software). Like the British Library facsimiles, the Bayeux project uses technology to imitate the physical act of consulting the medieval artifact: users of the Bayeux Tapestry edition, like visitors to the Bayeux Tapestry itself, move along what appears to be a seamless presentation of the entire 68 metre long object.

§14. The difference between The Bayeux Tapestry: Digital edition and the other two projects, however, is that in the Bayeux edition this technology plays an essential role in the representation of the underlying object. I am aware of no medieval manuscript that incorporates the act of turning the page into its artistic design; the Bayeux tapestry, however, was designed to be viewed as a single continuous document. By integrating hundreds of digital images into what behaves like a single facsimile, the Bayeux project allows users to consult the tapestry as its makers originally intended: moving fluidly from scene to scene and pausing every-so-often to examine individual panels or figures in greater detail.

§15. The organisation of the Bayeux edition is similarly well thought out. In contrast to the Hereford Mappamundi project, the Bayeux project is constructed around the object it reproduces. The opening screen shows a section from the facsimile (few screens would be able to accommodate the entire facsimile in reasonable detail) above a plot-line that provides an overview of the Tapestry’s entire contents in a single screen. Users can navigate the Tapestry scene-by-scene using arrow buttons at the bottom left of the browser window, centimetre by centimetre using a slider on the plot-line, or by jumping directly to an arbitrary point on the tapestry by clicking on the plot-line at the desired location. Tools, background information, other facsimiles of the tapestry, scene synopses, and notes are accessed through buttons at the bottom left corner of the browser. The first three types of material are presented in a separate window when chosen; the last two appear under the edition’s plot-line. Where the organisational conceit of the rota prevented users from accessing the entire Hereford map, the structure of the Bayeux edition encourages users to explore the entire length of the Tapestry.

§16. The Bayeux project also does its best to avoid imposing a particular structure on its editorial content. Where the Hereford project proved extremely difficult to navigate in ways not anticipated by its editor, The Bayeux Tapestry contains a slideshow utility that allows users to reorder elements of the edition to suit their own needs. While few readers perhaps will need to use this in their own study, the utility will prove of the greatest benefit to teachers and lecturers who wish to use the edition to illustrate their own work.


§17. The interactivity, flexibility, and sheer novelty of digital media bring with them great challenges for the electronic editor. Where scholars working in print can rely on centuries of precedent in designing their editions, those working in digital media still operate for the most part in the absence of any clear consensus as to even the most basic expectations of the genre. This technological freedom can, on the one hand, be extremely liberating: electronic editors can now produce editions of a much wider range of texts, artifacts, and concepts than was ever possible in print. At the same time, however, this freedom can also lead to the temptation of using technology for its own sake.

§18. The three projects discussed in this column have been produced by careful and technologically sophisticated researchers. The differences among them lie for the most part in the way they match their technological innovation to the needs of the objects they reproduce. The British Library and Hereford Mappamundi projects both suffer from an emphasis on the use of advanced technology for largely decorative purposes; both would be easier to use without much of their most superficially attractive technological features. The Bayeux Tapestry project, on the other hand, succeeds as an electronic text because it uses advanced technology that is well suited to its underlying object and allows it to be presented in a fashion difficult, if not impossible, in any other medium. Users of the British Library and Hereford facsimiles may find themselves wishing for a simpler presentation; few users of the Bayeux tapestry would wish that this edition had been published in book form.


1 This is a commonplace. For an influential discussion, see McGann 1995. Strictly speaking, print and digital/electronic in this discussion refer to accidentals of display rather than essential features of composition and storage. Texts composed and stored digitally can be displayed in print format, in which case they are subject to the same limitations as texts composed and stored entirely on paper. The importance of this distinction between composition and display is commonly missed in early theoretical discussions, which tend to concentrate exclusively on possibilities for on-screen display. In fact, as recent commercial and scholarly applications of xml are demonstrating, the real advantage of electronic composition and storage is reusability. Properly designed electronic texts can be published simultaneously in a number of different formats, allowing users to take advantage of the peculiar strengths and weaknesses of each. In my view, the most profound difference between electronic and print texts lies in the separation of content and presentation which makes this reuse of electronic texts possible.

2 It is easy to overemphasise the limitations of print and the flexibility of digital display. While books are for the most part physically static and two dimensional (the main exception are books published as loose pages intended for storage in binders or picture books with three dimensional figures), they are intellectually flexible: readers are free to reorganise them virtually by paging back and forth or using a table of contents or index to find and extract relevant information. In certain cases, e.g. dictionaries and encyclopedias, this intellectual flexibility is an essential feature of the genre. Not surprisingly, these genres were also among the first and most successful titles to be published in electronic format. Screens, for all their flexibility and interactivity, remain two-dimensional display devices subject to many of the same limitations of the printed page.

3 Robinson’s important article came to my attention after this column was in proof.

4 The observation that these examples are missing one or more traditional elements of a print edition is not intended as a criticism. Not all editions need all traditional parts, and, in several cases, the editorial approach used explicitly precludes the inclusion of the missing element. What the observation does demonstrate, however, is that no strong consensus exists as to what must appear in an electronic critical edition. The only thing common to all is the presence of facsimiles.

5 One possible objection to the above list of examples is that I am mixing editions produced using very different technologies over the greater part of a decade (a long time in humanities computing). This technical fluidity is one of the reasons for the lack of consensus among electronic editors, however. Since in most cases, moreover, the technology has aged before the editorial content (eight years is a relatively short time in medieval textual studies), the comparison is also valid from a user’s perspective: as a medievalist, I am as likely to want to consult the first disc in the Canterbury Tales Project as I am the most recent.

6 As is noted in the introduction to the edition, the facsimile reproduces a nineteenth-century copy of the Hereford map rather than the medieval Mappamundi itself. The images in the Bayeux disc discussed below are similarly based on facsimiles—albeit in this case photographs of the original tapestry.

7 This is less of a problem in the case of the British Library series, which presents itself primarily as an aid for the exhibition of manuscripts to the general public rather than a serious tool for professional scholars. The intended audience of the Mappamundi project is less certain: it is sold by a university press and seems to address itself to both scholars and students; much of its content, however, seems aimed at the high school level. The design flaws in both texts seem likely to discourage repeated use by scholars and members of the general public alike.

8 In the interests of full disclosure, readers should be aware that I am currently associated with Foys in several on-going projects. These projects began after the publication of Foys 2003, with which I am not associated in any way.

Works Cited


Back to content

Search my site


Current teaching

Recent changes to this site


See all...

Follow me on Twitter

At the dpod blog