Customizing your Greenstone library

How do I change the logo on the front page of my library ("greenstone digital library software")?
You can change the logo that appears at the top of the front page of your library by editing the home.dm file in your Greenstone "macros" folder and replacing all instances of "gsdlhead.gif" with the name of your logo image file.

Where can I get more information about customizing my Greenstone library?
Try this document. There is also a basic introduction to using CSS in Greenstone in this document.

How can I add a new page to my Greenstone library?
Adding a new static page to Greenstone is relatively simple and involves only customizations to macro files (found in gsdl/macros). (Adding a dynamic page is more difficult and involves adding a new action to the C++ receptionist.)

Lets look at the example of adding a new static page called mypage.


 * Link to the new page from the home page
 * Edit the _content_ macro in home.dm, adding the link where you want it. The link will look something like My Page.


 * Create the macro file:Create a new file called mypage.dm in gsdl/macros.
 * Tell the library about the new file:Edit gsdl/etc/main.cfg. Add mypage.dm to the macrofiles list

mypage.dm will contain all the content on the page. A basic mypage.dm might look something like the following.
 * package mypage _pagetitle_ {My New page}  _content_{  My New Page  This is the content of the page. }

The URL for the new page can be specified internally as _httppagex_(mypage): this maps to your library address with cgi arguments a=p&p=mypage.

If this is not a page that belongs to a collection, you should modify the 'home help prefs' buttons. You may like to add the following to your mypage.dm.


 * _javalinks_ {_imagehome_ _imagehelp_ _imagepref_ } _imagehelp_{_gsimage_(_home:httppagehomehelp_,_httpiconchelpof_,_httpiconchelpon_,help,_textimagehelp_)}  _imagepref_ {_gsimage_(_home:httppagehomepref_,_httpiconcprefof_,_httpiconcprefon_,pref,_textimagepref_)}

This will give you the standard home button, and the help and preferences buttons that link to the same pages as those on the home page. Help and preferences are different depending on whether you are in a collection or not.

If you are using the Windows local library server you probably need to restart it for the changes to take effect.

What do the cgi arguments used by library stand for?
CGI arguments encode the parameters of each page, for instance, what kind of page to display, what query to carry out etc. This page gives a list of the most common arguments and what they are used for.

How do I change the default settings for the cgi arguments?
You can set the default value of any cgi argument in the Greenstone\etc\main.cfg file. Add a line like cgiarg shortname=a argdefault=p This will set the default value of argument 'a' to 'p'. To find out which argument you need to change, see this page for a list of common arguments, or look at the page source of the page in the browser.

How do I get rid of the external link page?
Clicking on a link to an external resource from a Greenstone document takes the user to an intermediate page that says something like the following: "External Link The link you have selected is external to any of your currently selected collections. If you still wish to view this link and your browser has access to the Web, you can go forward to this page; otherwise use your browsers "back" button to return to the previous document.”

To get rid of this intermediate page, add the following to greenstone/etc/main.cfg cgiarg shortname=el argdefault=direct

How do I add a language selection box to each page?
You can do this by editing macros, adding some HTML elements and javascript to the pages.

In style.dm, add the following macro:

_languagescript_ {

function updatelang \{ newlang = document.LangForm.l.options[document.LangForm.l.selectedIndex].value;

href=location.href; if (href.match(/&l=[\w\-]+/)) href = href.replace(/&l=[\w\-]+/, "&l=" + newlang); else href += "&l=" + newlang; location.href= href; \} }

Then add the _languagescript_ macro to the end of the _globalscripts_ macro, i.e.

_globalscripts_{  _If_(_pagescriptextra_,_pagescriptextra_) _imagescript_ _languagescript_ }

Create a language change form in style.dm or base.dm:

_langselectform_{   French English Spanish

} Add whichever languages you want to support.

Then you need to add the _langselectform_ to all pages that you want it to appear in. To add it beneath the navigation bar on each collection page, add it just at the end of the _optnavigationbar_ macro in nav_css.dm. Otherwise, you will need to add it to the content macro of each page (or to a macro called from the _content_ macro).

How can I link documents in different collections together?
From Katherine (kjdon's) response to the mailing list:

You can create links between items in different collections. To do this you need to manually assign metadata to link things. What metadata you will need will depend on what you want to achieve.

Do you want to link always to the other collection? Or maybe link to something in the same collection as well?

A simple example: doc A in one collection, and doc B in another. They need to link to each other. Store for example, my.RelatedDoc metadata, for each document, and set the value to B for doc A, and A for doc B. (Usign my. as a metadata namespace for new metadata).

You will need to know the identifiers for each document. The easiest way to do this is to manually assign an identifier to each document. E.g. dc.Identifier. Then when importing, use -OIDtype assigned -OIDtype dc.Identifier options to import.pl.

In GLI, you can create a new metadata set or modify an existing one to add the new elements that you need.

Once you have a metadata element containing an id for a document to link to, then you can add a link in a format statement. If you want to link from the document itself, you can add the link in the DocumentText format statement. A link might look like:

related document</a> collname needs to be the name of the collection the related doc is in.

Another example, have a resource A with activities B, C and D.

You could manually add eg my.NumberActivites metadata (set to 3) for A. Then to link to them, you could maybe use search. If each activity stored the resource they were made from, then if you have an index on that resource metadata, you can create a link to a search of that resource. _httpquery_&c=collname&q=[DocOID]&other parameters. Other parameters will depend on what the index name is etc. DocOID is the id of the current document - if each resource/activity has an identifier, and that is used as the greenstone identifier, and also to link between them - then can use the current id to search for all activities based on this resource.

A useful page: http://wiki.greenstone.org/wiki/index.php/How_to_format_the_output_of_your_collection - format statement elements