$c->stash->{template} = 'index.tt';
}
+=head2 about
+
+A general overview/documentation page for the site.
+
+=cut
+
+sub about :Local :Args(0) {
+ my( $self, $c ) = @_;
+ $c->stash->{template} = 'about.tt';
+}
+
=head1 Elements of index page
=head2 directory
+// Global state variables
+var selectedTextID;
+var selectedTextInfo;
+var selectedStemmaID = -1;
+var stemmata = [];
+
+// Load the names of the appropriate traditions into the directory div.
+function refreshDirectory () {
+ var lmesg = $('#loading_message').clone();
+ $('#directory').empty().append( lmesg.contents() );
+ $('#directory').load( _get_url(["directory"]),
+ function(response, status, xhr) {
+ if (status == "error") {
+ var msg = "An error occurred: ";
+ $("#directory").html(msg + xhr.status + " " + xhr.statusText);
+ } else {
+ if( textOnLoad != "" ) {
+ // Call the click callback for the relevant text, if it is
+ // in the page.
+ $('#'+textOnLoad).click();
+ textOnLoad = "";
+ }
+ }
+ }
+ );
+}
+
+// Load a tradition with its information and stemmata into the tradition
+// view pane. Calls load_textinfo.
function loadTradition( textid, textname, editable ) {
selectedTextID = textid;
// First insert the placeholder image and register an error handler
// Then get and load the actual content.
// TODO: scale #stemma_graph both horizontally and vertically
// TODO: load svgs from SVG.Jquery (to make scaling react in Safari)
- $.getJSON( basepath + "/textinfo/" + textid, function (textdata) {
+ $.getJSON( _get_url([ "textinfo", textid ]), function (textdata) {
// Add the scalar data
selectedTextInfo = textdata;
load_textinfo();
$('#open_stemma_edit').hide();
$('#run_stexaminer').hide();
}
- load_stemma( selectedStemmaID, basepath );
+ load_stemma( selectedStemmaID );
// Set up the relationship mapper button
- $('#run_relater').attr( 'action', basepath + "/relation/" + textid );
+ $('#run_relater').attr( 'action', _get_url([ "relation", textid ]) );
});
}
+// Load the metadata about a tradition into the appropriate div.
function load_textinfo() {
$('#textinfo_waitbox').hide();
$('#textinfo_load_status').empty();
}
}
+// Enable / disable the appropriate buttons for paging through the stemma.
function show_stemmapager () {
$('.pager_left_button').unbind('click').addClass( 'greyed_out' );
$('.pager_right_button').unbind('click').addClass( 'greyed_out' );
}
}
-
+// Load a given stemma SVG into the stemmagraph box.
function load_stemma( idx ) {
// Load the stemma at idx
selectedStemmaID = idx;
$('#stemma_graph').empty();
$('#stemma_graph').append( stemmata[idx] );
// Stexaminer submit action
- var stexpath = basepath + "/stexaminer/" + selectedTextID + "/" + idx;
+ var stexpath = _get_url([ "stexaminer", selectedTextID, idx ]);
$('#run_stexaminer').attr( 'action', stexpath );
setTimeout( 'start_element_height = $("#stemma_graph .node")[0].getBBox().height;', 500 );
}
}
+// General-purpose error-handling function.
+// TODO make sure this gets used throughout, where appropriate.
function display_error( jqXHR, el ) {
var errmsg;
if( jqXHR.responseText == "" ) {
}
var msghtml = $('<span>').attr('class', 'error').text( "An error occurred: " + errmsg );
$(el).empty().append( msghtml ).show();
-}
\ No newline at end of file
+}
+
+function start_upload_dialog() {
+ if( typeof uploader != 'undefined' ){ uploader.destroy() };
+ $('#upload-collation-dialog').dialog('option', 'attach_uploader')();
+ $('#upload_status').empty();
+ $('#upload_button').button('disable');
+ $('#upload-collation-dialog').dialog('open');
+}
+
+// Utility function to neatly construct an application URL
+function _get_url( els ) {
+ return basepath + els.join('/');
+}
+
+$(document).ready( function() {
+ // call out to load the directory div
+ $('#textinfo_container').hide();
+ $('#textinfo_waitbox').hide();
+ refreshDirectory();
+
+ // Set up the textinfo edit dialog
+ $('#textinfo-edit-dialog').dialog({
+ autoOpen: false,
+ height: 200,
+ width: 300,
+ modal: true,
+ buttons: {
+ Save: function (evt) {
+ $("#edit_textinfo_status").empty();
+ $(evt.target).button("disable");
+ var requrl = _get_url([ "textinfo", selectedTextID ]);
+ var reqparam = $('#edit_textinfo').serialize();
+ $.post( requrl, reqparam, function (data) {
+ // Reload the selected text fields
+ selectedTextInfo = data;
+ load_textinfo();
+ // Reenable the button and close the form
+ $(evt.target).button("enable");
+ $('#textinfo-edit-dialog').dialog('close');
+ }, 'json' );
+ },
+ Cancel: function() {
+ $('#textinfo-edit-dialog').dialog('close');
+ }
+ },
+ open: function() {
+ $("#edit_textinfo_status").empty();
+ // Populate the form fields with the current values
+ // edit_(name, language, public, owner)
+ $.each([ 'name', 'language', 'owner' ], function( idx, k ) {
+ var fname = '#edit_' + k;
+ // Special case: language Default is basically language null
+ if( k == 'language' && selectedTextInfo[k] == 'Default' ) {
+ $(fname).val( "" );
+ } else {
+ $(fname).val( selectedTextInfo[k] );
+ }
+ });
+ if( selectedTextInfo['public'] == true ) {
+ $('#edit_public').attr('checked','true');
+ } else {
+ $('#edit_public').removeAttr('checked');
+ }
+ },
+ }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
+ $(event.target).parent().find('.ui-button').button("enable");
+ if( ajaxSettings.url.indexOf( 'textinfo' ) > -1
+ && ajaxSettings.type == 'POST' ) {
+ display_error( jqXHR, $("#edit_textinfo_status") );
+ }
+ });
+
+
+ // Set up the stemma editor dialog
+ $('#stemma-edit-dialog').dialog({
+ autoOpen: false,
+ height: 700,
+ width: 600,
+ modal: true,
+ buttons: {
+ Save: function (evt) {
+ $("#edit_stemma_status").empty();
+ $(evt.target).button("disable");
+ var stemmaseq = $('#stemmaseq').val();
+ var requrl = _get_url([ "stemma", selectedTextID, stemmaseq ]);
+ var reqparam = { 'dot': $('#dot_field').val() };
+ // TODO We need to stash the literal SVG string in stemmata
+ // somehow. Implement accept header on server side to decide
+ // whether to send application/json or application/xml?
+ $.post( requrl, reqparam, function (data) {
+ // We received a stemma SVG string in return.
+ // Update the current stemma sequence number
+ selectedStemmaID = data.stemmaid;
+ // Stash the answer in our SVG array
+ stemmata[selectedStemmaID] = data.stemmasvg;
+ // Display the new stemma
+ load_stemma( selectedStemmaID );
+ // Reenable the button and close the form
+ $(evt.target).button("enable");
+ $('#stemma-edit-dialog').dialog('close');
+ }, 'json' );
+ },
+ Cancel: function() {
+ $('#stemma-edit-dialog').dialog('close');
+ }
+ },
+ open: function(evt) {
+ $("#edit_stemma_status").empty();
+ var stemmaseq = $('#stemmaseq').val();
+ if( stemmaseq == 'n' ) {
+ // If we are creating a new stemma, populate the textarea with a
+ // bare digraph.
+ $(evt.target).dialog('option', 'title', 'Add a new stemma')
+ $('#dot_field').val( "digraph stemma {\n\n}" );
+ } else {
+ // If we are editing a stemma, grab its stemmadot and populate the
+ // textarea with that.
+ $(evt.target).dialog('option', 'title', 'Edit selected stemma')
+ $('#dot_field').val( 'Loading, please wait...' );
+ var doturl = _get_url([ "stemmadot", selectedTextID, stemmaseq ]);
+ $.getJSON( doturl, function (data) {
+ // Re-insert the line breaks
+ var dotstring = data.dot.replace(/\|n/gm, "\n");
+ $('#dot_field').val( dotstring );
+ });
+ }
+ },
+ }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
+ $(event.target).parent().find('.ui-button').button("enable");
+ if( ajaxSettings.url.indexOf( 'stemma' ) > -1
+ && ajaxSettings.type == 'POST' ) {
+ display_error( jqXHR, $("#edit_stemma_status") );
+ }
+ });
+
+ $('#upload-collation-dialog').dialog({
+ autoOpen: false,
+ height: 325,
+ width: 480,
+ modal: true,
+ buttons: {
+ pick: {
+ text: "Pick File",
+ id: "pick_uploadfile_button",
+ click: function() {}
+ },
+ upload: {
+ text: 'Upload',
+ id: 'upload_button',
+ click: function() {
+ $('#upload_status').empty();
+ uploader.start();
+ return false;
+ }
+ },
+ Cancel: function() {
+ $('#upload-collation-dialog').dialog('close');
+ }
+ },
+ attach_uploader: function() {
+ create_uploader( _get_url([ "newtradition" ]) );
+ $('#filelist').empty().html( 'Use the \'Pick\' button to choose a source file…' );
+ }
+ });
+
+ $('#stemma_graph').mousedown( function(evt) {
+ evt.stopPropagation();
+ $('#stemma_graph').data( 'mousedown_xy', [evt.clientX, evt.clientY] );
+ $('body').mousemove( function(evt) {
+ mouse_scale = 1; // for now, was: mouse_scale = svg_root_element.getScreenCTM().a;
+ dx = (evt.clientX - $('#stemma_graph').data( 'mousedown_xy' )[0]) / mouse_scale;
+ dy = (evt.clientY - $('#stemma_graph').data( 'mousedown_xy' )[1]) / mouse_scale;
+ $('#stemma_graph').data( 'mousedown_xy', [evt.clientX, evt.clientY] );
+ var svg_root = $('#stemma_graph svg').svg().svg('get').root();
+ var g = $('g.graph', svg_root).get(0);
+ current_translate = g.getAttribute( 'transform' ).split(/translate\(/)[1].split(')',1)[0].split(' ');
+ new_transform = g.getAttribute( 'transform' ).replace( /translate\([^\)]*\)/, 'translate(' + (parseFloat(current_translate[0]) + dx) + ' ' + (parseFloat(current_translate[1]) + dy) + ')' );
+ g.setAttribute( 'transform', new_transform );
+ evt.returnValue = false;
+ evt.preventDefault();
+ return false;
+ });
+ $('body').mouseup( function(evt) {
+ $('body').unbind('mousemove');
+ $('body').unbind('mouseup');
+ });
+ });
+
+ $('#stemma_graph').mousewheel(function (event, delta) {
+ event.returnValue = false;
+ event.preventDefault();
+ if (!delta || delta == null || delta == 0) delta = event.originalEvent.wheelDelta;
+ if (!delta || delta == null || delta == 0) delta = -1 * event.originalEvent.detail;
+ if( delta < -9 ) { delta = -9 };
+ var z = 1 + delta/10;
+ z = delta > 0 ? 1 : -1;
+ var svg_root = $('#stemma_graph svg').svg().svg('get').root();
+ var g = $('g.graph', svg_root).get(0);
+ if (g && ((z<1 && (g.getScreenCTM().a * start_element_height) > 4.0) || (z>=1 && (g.getScreenCTM().a * start_element_height) < 1000))) {
+ var scaleLevel = z/10;
+ current_scale = parseFloat( g.getAttribute( 'transform' ).split(/scale\(/)[1].split(')',1)[0].split(' ')[0] );
+ new_transform = g.getAttribute( 'transform' ).replace( /scale\([^\)]*\)/, 'scale(' + (current_scale + scaleLevel) + ')' );
+ g.setAttribute( 'transform', new_transform );
+ }
+ });
+
+});
var reltypes = {};
var readingdata = {};
-function getTextPath() {
- var currpath = window.location.pathname;
- // Get rid of trailing slash
- if( currpath.lastIndexOf('/') == currpath.length - 1 ) {
- currpath = currpath.slice( 0, currpath.length - 1)
- };
- // Get rid of query parameters
- if( currpath.lastIndexOf('?') != -1 ) {
- currpath = currpath.slice( 0, currpath.lastIndexOf('?') );
- };
- var path_elements = currpath.split('/');
- var textid = path_elements.pop();
- var basepath = path_elements.join( '/' );
- var path_parts = [ basepath, textid ];
- return path_parts;
-}
-
function getRelativePath() {
- var path_parts = getTextPath();
- return path_parts[0];
+ return basepath;
}
function getTextURL( which ) {
- var path_parts = getTextPath();
- return path_parts[0] + '/' + path_parts[1] + '/' + which;
+ return basepath + textid + '/' + which;
}
function getReadingURL( reading_id ) {
- var path_parts = getTextPath();
- return path_parts[0] + '/' + path_parts[1] + '/reading/' + reading_id;
+ return basepath + textid + '/reading/' + reading_id;
}
// Make an XML ID into a valid selector
function add_relations( callback_fn ) {
var basepath = getRelativePath();
var textrelpath = getTextURL( 'relationships' );
- $.getJSON( basepath + '/definitions', function(data) {
+ $.getJSON( basepath + 'definitions', function(data) {
var rel_types = data.types.sort();
$.getJSON( textrelpath,
function(data) {
var reltypes = {};
var readingdata = {};
-function getTextPath() {
- var currpath = window.location.pathname;
- // Get rid of trailing slash
- if( currpath.lastIndexOf('/') == currpath.length - 1 ) {
- currpath = currpath.slice( 0, currpath.length - 1)
- };
- // Get rid of query parameters
- if( currpath.lastIndexOf('?') != -1 ) {
- currpath = currpath.slice( 0, currpath.lastIndexOf('?') );
- };
- var path_elements = currpath.split('/');
- var textid = path_elements.pop();
- var basepath = path_elements.join( '/' );
- var path_parts = [ basepath, textid ];
- return path_parts;
-}
-
function getRelativePath() {
- var path_parts = getTextPath();
- return path_parts[0];
+ return basepath;
}
function getTextURL( which ) {
- var path_parts = getTextPath();
- return path_parts[0] + '/' + path_parts[1] + '/' + which;
+ return basepath + textid + '/' + which;
}
function getReadingURL( reading_id ) {
- var path_parts = getTextPath();
- return path_parts[0] + '/' + path_parts[1] + '/reading/' + reading_id;
+ return basepath + textid + '/reading/' + reading_id;
}
// Make an XML ID into a valid selector
function add_relations( callback_fn ) {
var basepath = getRelativePath();
var textrelpath = getTextURL( 'relationships' );
- $.getJSON( basepath + '/definitions', function(data) {
+ $.getJSON( basepath + 'definitions', function(data) {
var rel_types = data.types.sort();
$.each( rel_types, function(index, value) {
$('#keymaplist').append( $('<li>').css( "border-color", relation_manager.relation_colors[index] ).text(value) );
applicationjs = c.uri_for( 'js/componentload.js' )
%]
<script type="text/javascript">
-var basepath = window.location.pathname
-if( basepath.lastIndexOf('/') == basepath.length - 1 ) {
- basepath = basepath.slice( 0, basepath.length - 1)
-};
+// Set global variables that must be passed by the server
+var basepath = "[% c.uri_for( '/' ) %]";
var textOnLoad = "[% withtradition %]";
-var selectedTextID;
-var selectedTextInfo;
-var selectedStemmaID = -1;
-var stemmata = [];
-
-function refreshDirectory () {
- var lmesg = $('#loading_message').clone();
- $('#directory').empty().append( lmesg.contents() );
- $('#directory').load( "[% c.uri_for( 'directory' ) %]",
- function(response, status, xhr) {
- if (status == "error") {
- var msg = "An error occurred: ";
- $("#directory").html(msg + xhr.status + " " + xhr.statusText);
- } else {
- if( textOnLoad != "" ) {
- // Call the click callback for the relevant text, if it is
- // in the page.
- $('#'+textOnLoad).click();
- textOnLoad = "";
- }
- }
- }
- );
-}
-
-function start_upload_dialog() {
- if( typeof uploader != 'undefined' ){ uploader.destroy() };
- $('#upload-collation-dialog').dialog('option', 'attach_uploader')();
- $('#upload_status').empty();
- $('#upload_button').button('disable');
- $('#upload-collation-dialog').dialog('open');
-}
-
-$(document).ready( function() {
- // call out to load the directory div
- $('#textinfo_container').hide();
- $('#textinfo_waitbox').hide();
- refreshDirectory();
-
- // Set up the textinfo edit dialog
- $('#textinfo-edit-dialog').dialog({
- autoOpen: false,
- height: 200,
- width: 300,
- modal: true,
- buttons: {
- Save: function (evt) {
- $("#edit_textinfo_status").empty();
- $(evt.target).button("disable");
- var requrl = "[% c.uri_for( '/textinfo' ) %]/" + selectedTextID;
- var reqparam = $('#edit_textinfo').serialize();
- $.post( requrl, reqparam, function (data) {
- // Reload the selected text fields
- selectedTextInfo = data;
- load_textinfo();
- // Reenable the button and close the form
- $(evt.target).button("enable");
- $('#textinfo-edit-dialog').dialog('close');
- }, 'json' );
- },
- Cancel: function() {
- $('#textinfo-edit-dialog').dialog('close');
- }
- },
- open: function() {
- $("#edit_textinfo_status").empty();
- // Populate the form fields with the current values
- // edit_(name, language, public, owner)
- $.each([ 'name', 'language', 'owner' ], function( idx, k ) {
- var fname = '#edit_' + k;
- // Special case: language Default is basically language null
- if( k == 'language' && selectedTextInfo[k] == 'Default' ) {
- $(fname).val( "" );
- } else {
- $(fname).val( selectedTextInfo[k] );
- }
- });
- if( selectedTextInfo['public'] == true ) {
- $('#edit_public').attr('checked','true');
- } else {
- $('#edit_public').removeAttr('checked');
- }
- },
- }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
- $(event.target).parent().find('.ui-button').button("enable");
- if( ajaxSettings.url.indexOf( 'textinfo' ) > -1
- && ajaxSettings.type == 'POST' ) {
- display_error( jqXHR, $("#edit_textinfo_status") );
- }
- });
-
-
- // Set up the stemma editor dialog
- $('#stemma-edit-dialog').dialog({
- autoOpen: false,
- height: 700,
- width: 600,
- modal: true,
- buttons: {
- Save: function (evt) {
- $("#edit_stemma_status").empty();
- $(evt.target).button("disable");
- var stemmaseq = $('#stemmaseq').val();
- var requrl = "[% c.uri_for( '/stemma' ) %]/" + selectedTextID + "/" + stemmaseq;
- var reqparam = { 'dot': $('#dot_field').val() };
- // TODO We need to stash the literal SVG string in stemmata
- // somehow. Implement accept header on server side to decide
- // whether to send application/json or application/xml?
- $.post( requrl, reqparam, function (data) {
- // We received a stemma SVG string in return.
- // Update the current stemma sequence number
- selectedStemmaID = data.stemmaid;
- // Stash the answer in our SVG array
- stemmata[selectedStemmaID] = data.stemmasvg;
- // Display the new stemma
- load_stemma( selectedStemmaID );
- // Reenable the button and close the form
- $(evt.target).button("enable");
- $('#stemma-edit-dialog').dialog('close');
- }, 'json' );
- },
- Cancel: function() {
- $('#stemma-edit-dialog').dialog('close');
- }
- },
- open: function(evt) {
- $("#edit_stemma_status").empty();
- var stemmaseq = $('#stemmaseq').val();
- if( stemmaseq == 'n' ) {
- // If we are creating a new stemma, populate the textarea with a
- // bare digraph.
- $(evt.target).dialog('option', 'title', 'Add a new stemma')
- $('#dot_field').val( "digraph stemma {\n\n}" );
- } else {
- // If we are editing a stemma, grab its stemmadot and populate the
- // textarea with that.
- $(evt.target).dialog('option', 'title', 'Edit selected stemma')
- $('#dot_field').val( 'Loading, please wait...' );
- var doturl = "[% c.uri_for( '/stemmadot' ) %]/" + selectedTextID + "/" + stemmaseq;
- $.getJSON( doturl, function (data) {
- // Re-insert the line breaks
- var dotstring = data.dot.replace(/\|n/gm, "\n");
- $('#dot_field').val( dotstring );
- });
- }
- },
- }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
- $(event.target).parent().find('.ui-button').button("enable");
- if( ajaxSettings.url.indexOf( 'stemma' ) > -1
- && ajaxSettings.type == 'POST' ) {
- display_error( jqXHR, $("#edit_stemma_status") );
- }
- });
-
- $('#upload-collation-dialog').dialog({
- autoOpen: false,
- height: 325,
- width: 480,
- modal: true,
- buttons: {
- pick: {
- text: "Pick File",
- id: "pick_uploadfile_button",
- click: function() {}
- },
- upload: {
- text: 'Upload',
- id: 'upload_button',
- click: function() {
- $('#upload_status').empty();
- uploader.start();
- return false;
- }
- },
- Cancel: function() {
- $('#upload-collation-dialog').dialog('close');
- }
- },
- attach_uploader: function() {
- create_uploader( "[% c.uri_for ( '/newtradition' ) %]" );
- $('#filelist').empty().html( 'Use the \'Pick\' button to choose a source file…' );
- }
- });
-
- $('#stemma_graph').mousedown( function(evt) {
- evt.stopPropagation();
- $('#stemma_graph').data( 'mousedown_xy', [evt.clientX, evt.clientY] );
- $('body').mousemove( function(evt) {
- mouse_scale = 1; // for now, was: mouse_scale = svg_root_element.getScreenCTM().a;
- dx = (evt.clientX - $('#stemma_graph').data( 'mousedown_xy' )[0]) / mouse_scale;
- dy = (evt.clientY - $('#stemma_graph').data( 'mousedown_xy' )[1]) / mouse_scale;
- $('#stemma_graph').data( 'mousedown_xy', [evt.clientX, evt.clientY] );
- var svg_root = $('#stemma_graph svg').svg().svg('get').root();
- var g = $('g.graph', svg_root).get(0);
- current_translate = g.getAttribute( 'transform' ).split(/translate\(/)[1].split(')',1)[0].split(' ');
- new_transform = g.getAttribute( 'transform' ).replace( /translate\([^\)]*\)/, 'translate(' + (parseFloat(current_translate[0]) + dx) + ' ' + (parseFloat(current_translate[1]) + dy) + ')' );
- g.setAttribute( 'transform', new_transform );
- evt.returnValue = false;
- evt.preventDefault();
- return false;
- });
- $('body').mouseup( function(evt) {
- $('body').unbind('mousemove');
- $('body').unbind('mouseup');
- });
- });
-
- $('#stemma_graph').mousewheel(function (event, delta) {
- event.returnValue = false;
- event.preventDefault();
- if (!delta || delta == null || delta == 0) delta = event.originalEvent.wheelDelta;
- if (!delta || delta == null || delta == 0) delta = -1 * event.originalEvent.detail;
- if( delta < -9 ) { delta = -9 };
- var z = 1 + delta/10;
- z = delta > 0 ? 1 : -1;
- var svg_root = $('#stemma_graph svg').svg().svg('get').root();
- var g = $('g.graph', svg_root).get(0);
- if (g && ((z<1 && (g.getScreenCTM().a * start_element_height) > 4.0) || (z>=1 && (g.getScreenCTM().a * start_element_height) < 1000))) {
- var scaleLevel = z/10;
- current_scale = parseFloat( g.getAttribute( 'transform' ).split(/scale\(/)[1].split(')',1)[0].split(' ')[0] );
- new_transform = g.getAttribute( 'transform' ).replace( /scale\([^\)]*\)/, 'scale(' + (current_scale + scaleLevel) + ')' );
- g.setAttribute( 'transform', new_transform );
- }
- });
-
-});
</script>
[% END %]
<div id="topbanner">
<h1>Stemmaweb - a collection of tools for analysis of collated texts</h1>
- <span class="mainnav">[% IF c.user_exists %]Hello! [% c.user.get_object.email %] <a class="navlink" href="[% c.uri_for( '/logout' ) %]">Sign out</a> | [% ELSE %]<a class="navlink" onclick="window.open('[% c.uri_for( '/login' ) %]', 'loginwindow', 'height=385,width=445')">Login</a> | [% END %]<a class="navlink" href="[% c.uri_for( 'about.html' ) %]">About</a> </span>
+ <span class="mainnav">[% IF c.user_exists %]Hello! [% c.user.get_object.email %] <a class="navlink" href="[% c.uri_for( '/logout' ) %]">Sign out</a> | [% ELSE %]<a class="navlink" onclick="window.open('[% c.uri_for( '/login' ) %]', 'loginwindow', 'height=385,width=445')">Login</a> | [% END %]<a class="navlink" href="[% c.uri_for( '/about' ) %]">About</a> </span>
</div>
<div id="directory_container">
<h2>Text directory</h2>
applicationstyle = c.uri_for('/css/relationship.css')
%]
<script type="text/javascript">
+// Load the text ID and the base path
+var basepath = "[% c.uri_for( '/relation/' ) %]";
+var textid = "[% textid %]";
$(document).ready(function () {
loadSVG('[% svg_string %]');
<h2>Text relationship mapper</h2>
<h3>An Interedition prototype interface</h3>
- <p>The relationship mapper is a tool born of the joint requirements of the <a href="http://byzantini.st/treeoftexts/">Tree of Texts</a> project at the KU Leuven, and the <a href="http://www.bibelwissenschaft.de/start/editionsprojekte/editio-critica-maior-ecm/">Editio Critica Maior</a> project at the Institute for New Testament Research (INTF), University of Münster.</p>
+ <p>The relationship mapper is a tool born of the joint requirements of the <a href="http://byzantini.st/treeoftexts/">Tree of Texts</a> project at the KU Leuven, and the <a href="http://www.bibelwissenschaft.de/start/editionsprojekte/editio-critica-maior-ecm/">Editio Critica Maior</a> project at the Institute for New Testament Research (INTF), University of Münster. Much of the interface to the tool was contributed by the <a href="http://www.huygens.knaw.nl/">Huygens Institute</a> of the Royal Dutch Academy of Sciences.</p>
<p>The premise of the tool is that, once a set of texts has been collated, there will be a need to chart the relationships between the variants—are they substantially the same word? Different words meaning the same thing? Is one an orthographic variant of the other that should be excluded from any eventual apparatus?</p>